* partition.h: New file.
This commit is contained in:
		
							
								
								
									
										81
									
								
								include/partition.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								include/partition.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| /* List implentation of a partition of consecutive integers. | ||||
|    Copyright (C) 2000 Free Software Foundation, Inc. | ||||
|    Contributed by CodeSourcery, LLC. | ||||
|  | ||||
|    This file is part of GNU CC. | ||||
|  | ||||
|    GNU CC is free software; you can redistribute it and/or modify | ||||
|    it under the terms of the GNU General Public License as published by | ||||
|    the Free Software Foundation; either version 2, or (at your option) | ||||
|    any later version. | ||||
|  | ||||
|    GNU CC is distributed in the hope that it will be useful, | ||||
|    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|    GNU General Public License for more details. | ||||
|  | ||||
|    You should have received a copy of the GNU General Public License | ||||
|    along with GNU CC; see the file COPYING.  If not, write to | ||||
|    the Free Software Foundation, 59 Temple Place - Suite 330, | ||||
|    Boston, MA 02111-1307, USA.  */ | ||||
|  | ||||
| /* This package implements a partition of consecutive integers.  The | ||||
|    elements are partitioned into classes.  Each class is represented | ||||
|    by one of its elements, the canonical element, which is chosen | ||||
|    arbitrarily from elements in the class.  The principal operations | ||||
|    on a partition are FIND, which takes an element, determines its | ||||
|    class, and returns the canonical element for that class, and UNION, | ||||
|    which unites the two classes that contain two given elements into a | ||||
|    single class. | ||||
|  | ||||
|    The list implementation used here provides constant-time finds.  By | ||||
|    storing the size of each class with the class's canonical element, | ||||
|    it is able to perform unions over all the classes in the partition | ||||
|    in O (N log N) time.  */ | ||||
|  | ||||
| #ifndef _PARTITION_H | ||||
| #define _PARTITION_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif /* __cplusplus */ | ||||
|  | ||||
| #include <ansidecl.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| struct partition_elem | ||||
| { | ||||
|   /* The canonical element that represents the class containing this | ||||
|      element.  */ | ||||
|   int class_element; | ||||
|   /* The next element in this class.  Elements in each class form a | ||||
|      circular list.  */ | ||||
|   struct partition_elem* next; | ||||
|   /* The number of elements in this class.  Valid only if this is the | ||||
|      canonical element for its class.  */ | ||||
|   unsigned class_count; | ||||
| }; | ||||
|  | ||||
| typedef struct partition_def  | ||||
| { | ||||
|   /* The number of elements in this partition.  */ | ||||
|   int num_elements; | ||||
|   /* The elements in the partition.  */ | ||||
|   struct partition_elem elements[1]; | ||||
| } *partition; | ||||
|  | ||||
| extern partition partition_new          PARAMS((int)); | ||||
| extern void partition_delete            PARAMS((partition)); | ||||
| extern int partition_union              PARAMS((partition, | ||||
| 						int, | ||||
| 						int)); | ||||
| extern void partition_print             PARAMS((partition, | ||||
| 						FILE*)); | ||||
|  | ||||
| /* Returns the canonical element corresponding to the class containing | ||||
|    ELEMENT__ in PARTITION__.  */ | ||||
|  | ||||
| #define partition_find(partition__, element__) \ | ||||
|     ((partition__)->elements[(element__)].class_element) | ||||
|  | ||||
| #endif /* _PARTITION_H */ | ||||
		Reference in New Issue
	
	Block a user