You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							54 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							54 lines
						
					
					
						
							1.3 KiB
						
					
					
				
								// Symbols.
							 | 
						|
								
							 | 
						|
								#ifndef _CL_SYMBOL_H
							 | 
						|
								#define _CL_SYMBOL_H
							 | 
						|
								
							 | 
						|
								#include "cln/string.h"
							 | 
						|
								
							 | 
						|
								namespace cln {
							 | 
						|
								
							 | 
						|
								// Symbols are just strings, uniquified through a global hash table.
							 | 
						|
								
							 | 
						|
								#if (defined(__alpha__) && !defined(__GNUC__))
							 | 
						|
								struct hashuniq;
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								struct cl_symbol : public cl_rcpointer {
							 | 
						|
								public:
							 | 
						|
									// Conversion to string.
							 | 
						|
									operator cl_string () const;
							 | 
						|
									// Constructors.
							 | 
						|
									cl_symbol (const cl_string&); // create or lookup a symbol from its name
							 | 
						|
									cl_symbol (const cl_symbol&);
							 | 
						|
									// Assignment operators.
							 | 
						|
									cl_symbol& operator= (const cl_symbol&);
							 | 
						|
									// Private pointer manipulations.
							 | 
						|
									cl_symbol (cl_private_thing p) : cl_rcpointer (p) {}
							 | 
						|
								public: /* ugh */
							 | 
						|
									// Create a new symbol given its name.
							 | 
						|
									cl_symbol (struct hashuniq * null, const cl_string& s);
							 | 
						|
								};
							 | 
						|
								CL_DEFINE_COPY_CONSTRUCTOR2(cl_symbol,cl_rcpointer)
							 | 
						|
								CL_DEFINE_ASSIGNMENT_OPERATOR(cl_symbol,cl_symbol)
							 | 
						|
								
							 | 
						|
								// A symbol points to a string, so to convert cl_symbol -> cl_string, we just
							 | 
						|
								// take the pointer and put it into a cl_string.
							 | 
						|
								inline cl_symbol::operator cl_string () const
							 | 
						|
								{
							 | 
						|
									return cl_string(_as_cl_private_thing());
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Comparison.
							 | 
						|
								inline bool equal (const cl_symbol& s1, const cl_symbol& s2)
							 | 
						|
								{
							 | 
						|
									return (s1.pointer == s2.pointer);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Hash code.
							 | 
						|
								extern unsigned long hashcode (const cl_symbol& s);
							 | 
						|
								
							 | 
						|
								CL_REQUIRE(cl_symbol)
							 | 
						|
								
							 | 
						|
								}  // namespace cln
							 | 
						|
								
							 | 
						|
								#endif /* _CL_SYMBOL_H */
							 |