| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | namespace factor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-24 05:27:45 -04:00
										 |  |  | template<typename Array> cell array_capacity(const Array *array) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | { | 
					
						
							|  |  |  | #ifdef FACTOR_DEBUG
 | 
					
						
							| 
									
										
										
										
											2011-11-17 23:42:30 -05:00
										 |  |  | 	FACTOR_ASSERT(array->type() == Array::type_number); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 	return array->capacity >> TAG_BITS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | template<typename Array> cell array_size(cell capacity) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | 	return sizeof(Array) + capacity * Array::element_size; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | template<typename Array> cell array_size(Array *array) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | 	return array_size<Array>(array_capacity(array)); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:43:58 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 00:30:55 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2009-10-20 13:45:00 -04:00
										 |  |  | template<typename Array> Array *factor_vm::allot_uninitialized_array(cell capacity) | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | 	Array *array = allot<Array>(array_size<Array>(capacity)); | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | 	array->capacity = tag_fixnum(capacity); | 
					
						
							|  |  |  | 	return array; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | template<typename Array> bool factor_vm::reallot_array_in_place_p(Array *array, cell capacity) | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-05 23:16:08 -04:00
										 |  |  | 	return nursery.contains_p(array) && capacity <= array_capacity(array); | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 00:30:55 -04:00
										 |  |  | /* Allocates memory (sometimes) */ | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | template<typename Array> Array *factor_vm::reallot_array(Array *array_, cell capacity) | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<Array> array(array_,this); | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-12 19:11:23 -04:00
										 |  |  | 	if (array_capacity(array.untagged()) == capacity) | 
					
						
							| 
									
										
										
										
											2011-10-12 15:34:30 -04:00
										 |  |  | 		return array.untagged(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | 	if(reallot_array_in_place_p(array.untagged(),capacity)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		array->capacity = tag_fixnum(capacity); | 
					
						
							|  |  |  | 		return array.untagged(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		cell to_copy = array_capacity(array.untagged()); | 
					
						
							|  |  |  | 		if(capacity < to_copy) | 
					
						
							|  |  |  | 			to_copy = capacity; | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-20 13:45:00 -04:00
										 |  |  | 		Array *new_array = allot_uninitialized_array<Array>(capacity); | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 09:47:05 -04:00
										 |  |  | 		memcpy(new_array + 1,array.untagged() + 1,to_copy * Array::element_size); | 
					
						
							|  |  |  | 		memset((char *)(new_array + 1) + to_copy * Array::element_size, | 
					
						
							|  |  |  | 		       0,(capacity - to_copy) * Array::element_size); | 
					
						
							| 
									
										
										
										
											2009-10-13 22:16:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 14:53:10 -04:00
										 |  |  | 		return new_array; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | } |