#8: Bare bones
This commit is contained in:
		
							parent
							
								
									23e4f0befa
								
							
						
					
					
						commit
						2bebee6002
					
				
					 3 changed files with 76 additions and 3 deletions
				
			
		
							
								
								
									
										8
									
								
								src/memory/map.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/memory/map.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * map.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * An immutable hashmap in vector space.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * (c) 2019 Simon Brooke <simon@journeyman.cc>
 | 
				
			||||||
 | 
					 * Licensed under GPL version 2.0, or, at your option, any later version.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										65
									
								
								src/memory/map.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/memory/map.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,65 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * map.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * An immutable hashmap in vector space.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * (c) 2019 Simon Brooke <simon@journeyman.cc>
 | 
				
			||||||
 | 
					 * Licensed under GPL version 2.0, or, at your option, any later version.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __psse_map_h
 | 
				
			||||||
 | 
					#define __psse_map_h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "consspaceobject.h"
 | 
				
			||||||
 | 
					#include "conspage.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * macros for the tag of a mutable map.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define MAPTAG "IMAP"
 | 
				
			||||||
 | 
					#define MAPTV 1346456905
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Number of buckets in a single tier map.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define BUCKETSINMAP 256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Maximum number of entries in an association-list bucket.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define MAXENTRIESINASSOC 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The vector-space payload of a map object.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct map_payload {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * There is a default hash function, which is used if `hash_function` is
 | 
				
			||||||
 | 
					     * `nil` (which it normally should be); and keywords will probably carry
 | 
				
			||||||
 | 
					     * their own hash values. But it will be possible to override the hash
 | 
				
			||||||
 | 
					     * function by putting a function of one argument returning an integer
 | 
				
			||||||
 | 
					     * here. */
 | 
				
			||||||
 | 
					    struct cons_pointer hash_function = NIL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Obviously the number of buckets in a map is a trade off, and this may need
 | 
				
			||||||
 | 
					     * tuning - or it may even be necessary to have different sized base maps. The
 | 
				
			||||||
 | 
					     * idea here is that the value of a bucket is
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * 1. `nil`; or
 | 
				
			||||||
 | 
					     * 2. an association list; or
 | 
				
			||||||
 | 
					     * 3. a map.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * All buckets are initially `nil`. Adding a value to a `nil` bucket returns
 | 
				
			||||||
 | 
					     * a map with a new bucket in the form of an assoc list. Subsequent additions
 | 
				
			||||||
 | 
					     * cons new key/value pairs onto the assoc list, until there are
 | 
				
			||||||
 | 
					     * `MAXENTRIESINASSOC` pairs, at which point if a further value is added to
 | 
				
			||||||
 | 
					     * the same bucket the bucket returned will be in the form of a second level
 | 
				
			||||||
 | 
					     * map. My plan is that buckets the first level map will be indexed on the
 | 
				
			||||||
 | 
					     * first sixteen bits of the hash value, those in the second on the second
 | 
				
			||||||
 | 
					     * sixteen, and, potentially, so on.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    struct cons_pointer buckets[BUCKETSINMAP];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -18,12 +18,12 @@
 | 
				
			||||||
 * Licensed under GPL version 2.0, or, at your option, any later version.
 | 
					 * Licensed under GPL version 2.0, or, at your option, any later version.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __psse_stack_h
 | 
				
			||||||
 | 
					#define __psse_stack_h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "consspaceobject.h"
 | 
					#include "consspaceobject.h"
 | 
				
			||||||
#include "conspage.h"
 | 
					#include "conspage.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __stack_h
 | 
					 | 
				
			||||||
#define __stack_h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * macros for the tag of a stack frame.
 | 
					 * macros for the tag of a stack frame.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue