diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/open-axiom/Charset (renamed from src/include/Charset.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/Constructor (renamed from src/include/Constructor.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/Database (renamed from src/include/Database.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/FileMapping (renamed from src/include/FileMapping.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/Input (renamed from src/include/Input.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/InputFragment (renamed from src/include/InputFragment.h) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/Lisp (renamed from src/include/Lisp.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/SourceFile (renamed from src/include/SourceFile.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/defaults (renamed from src/include/defaults.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/diagnostics (renamed from src/include/diagnostics.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/dialect (renamed from src/include/dialect.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/hash-table | 85 | ||||
-rw-r--r-- | src/include/open-axiom/iterator (renamed from src/include/iterator.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/sexpr (renamed from src/include/sexpr.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/storage (renamed from src/include/storage.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/string-pool | 85 | ||||
-rw-r--r-- | src/include/open-axiom/structure (renamed from src/include/structure.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/token (renamed from src/include/token.H) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/token-value (renamed from src/include/token-value.def) | 0 | ||||
-rw-r--r-- | src/include/open-axiom/vm (renamed from src/include/vm.H) | 0 |
20 files changed, 170 insertions, 0 deletions
diff --git a/src/include/Charset.H b/src/include/open-axiom/Charset index 58fa9ea8..58fa9ea8 100644 --- a/src/include/Charset.H +++ b/src/include/open-axiom/Charset diff --git a/src/include/Constructor.H b/src/include/open-axiom/Constructor index bfab3940..bfab3940 100644 --- a/src/include/Constructor.H +++ b/src/include/open-axiom/Constructor diff --git a/src/include/Database.H b/src/include/open-axiom/Database index cea082c8..cea082c8 100644 --- a/src/include/Database.H +++ b/src/include/open-axiom/Database diff --git a/src/include/FileMapping.H b/src/include/open-axiom/FileMapping index 0c836efb..0c836efb 100644 --- a/src/include/FileMapping.H +++ b/src/include/open-axiom/FileMapping diff --git a/src/include/Input.H b/src/include/open-axiom/Input index fa4555b8..fa4555b8 100644 --- a/src/include/Input.H +++ b/src/include/open-axiom/Input diff --git a/src/include/InputFragment.h b/src/include/open-axiom/InputFragment index 7f317973..7f317973 100644 --- a/src/include/InputFragment.h +++ b/src/include/open-axiom/InputFragment diff --git a/src/include/Lisp.H b/src/include/open-axiom/Lisp index a189dd38..a189dd38 100644 --- a/src/include/Lisp.H +++ b/src/include/open-axiom/Lisp diff --git a/src/include/SourceFile.H b/src/include/open-axiom/SourceFile index 41b085a3..41b085a3 100644 --- a/src/include/SourceFile.H +++ b/src/include/open-axiom/SourceFile diff --git a/src/include/defaults.H b/src/include/open-axiom/defaults index db399419..db399419 100644 --- a/src/include/defaults.H +++ b/src/include/open-axiom/defaults diff --git a/src/include/diagnostics.H b/src/include/open-axiom/diagnostics index 9cb0fce1..9cb0fce1 100644 --- a/src/include/diagnostics.H +++ b/src/include/open-axiom/diagnostics diff --git a/src/include/dialect.H b/src/include/open-axiom/dialect index bcfddd04..bcfddd04 100644 --- a/src/include/dialect.H +++ b/src/include/open-axiom/dialect diff --git a/src/include/open-axiom/hash-table b/src/include/open-axiom/hash-table new file mode 100644 index 00000000..d74c7760 --- /dev/null +++ b/src/include/open-axiom/hash-table @@ -0,0 +1,85 @@ +// Copyright (C) 2010, Gabriel Dos Reis. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// - Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// +// - Neither the name of The Numerical Algorithms Group Ltd. nor the +// names of its contributors may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef OPENAXIOM_HASH_TABLE_INCLUDED +#define OPENAXIOM_HASH_TABLE_INCLUDED + +// --% Author: Gabriel Dos Reis. +// --% Description: +// --% Simple hash table facility. To be replaced by C++0x +// --% hash tables when C++0x compilers become common place. + +#include <open-axiom/storage> + +namespace OpenAxiom { + // -------------------- + // -- HashTableEntry -- + // -------------------- + // Datatype for entries in a parameterized hash table. + // The type parameter is required to be a value-construcitble datatype. + // A table bucket entry is required to be at least 8-byte aligned + // so that an instance of it can be used directly as a VM value. + // See <open-axiom/vm> for more description. + template<typename T> + struct alignas(8) HashTableEntry : T { + HashTableEntry* chain; // previous item in the same bucket chain + size_t hash; // hash code of stored data + }; + + // -------------------- + // -- BasicHashTable -- + // -------------------- + // A simple hash table data structure. Ideally, we would like to use + // standard C++ types, but hash tables were only in a C++ 2003 TR, + // officially part of C++0x standard library. We still don't have + // wide-spread C++0x compilers. + template<typename T> + struct BasicHashTable : private Memory::Arena<HashTableEntry<T> > { + typedef HashTableEntry<T> EntryType; + explicit BasicHashTable(size_t n) + : Memory::Arena<HashTableEntry<T> >(n), + buckets(this->allocate(n)), nbuckets(n) { } + + EntryType* hash_chain(size_t h) const { + return buckets + (h % nbuckets); + } + + EntryType* new_bucket() { + return this->allocate(1); + } + + private: + HashTableEntry<T>* const buckets; + const size_t nbuckets; + }; +} + +#endif // OPENAXIOM_HASH_TABLE_INCLUDED diff --git a/src/include/iterator.H b/src/include/open-axiom/iterator index 048dc67c..048dc67c 100644 --- a/src/include/iterator.H +++ b/src/include/open-axiom/iterator diff --git a/src/include/sexpr.H b/src/include/open-axiom/sexpr index 6920e436..6920e436 100644 --- a/src/include/sexpr.H +++ b/src/include/open-axiom/sexpr diff --git a/src/include/storage.H b/src/include/open-axiom/storage index e414dec2..e414dec2 100644 --- a/src/include/storage.H +++ b/src/include/open-axiom/storage diff --git a/src/include/open-axiom/string-pool b/src/include/open-axiom/string-pool new file mode 100644 index 00000000..1f746e6d --- /dev/null +++ b/src/include/open-axiom/string-pool @@ -0,0 +1,85 @@ +// Copyright (C) 2010-2015, Gabriel Dos Reis. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// - Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the +// distribution. +// +// - Neither the name of The Numerical Algorithms Group Ltd. nor the +// names of its contributors may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef OPENAXIOM_STRING_POOL_INCLUDED +#define OPENAXIOM_STRING_POOL_INCLUDED + +#include <open-axiom/hash-table> + +// --% Author: Gabriel Dos Reis. +// --% Description: +// --% Basic persistent string facility. +// --% A stringpool for allocating long-living string objects. + +namespace OpenAxiom { + struct StringPool; + + // ---------------- + // -- StringItem -- + // ---------------- + // String data allocated from a stringpool. + struct StringItem { + const Byte* begin() const { return text; } + const Byte* end() const { return text + length; } + size_t size() const { return length; } + bool equal(const Byte*, size_t) const; + protected: + const Byte* text; // pointer to the byte sequence + size_t length; // number of bytes in this string + friend StringPool; + StringItem() : text(), length() { } + }; + + // ---------------- + // -- StringPool -- + // ---------------- + // A string-pool object is a repository of long-living string objects. + // It contains no duplicates, therefore allows fast equality + // comparison of string objects. + struct StringPool : private BasicHashTable<StringItem> { + using BasicHashTable<StringItem>::EntryType; + + StringPool(); + // Intern a NUL-terminated sequence of characters. + EntryType* intern(const char*); + + // Intern a sequence of characters given by its start and length. + EntryType* intern(const Byte*, size_t); + private: + Memory::Arena<Byte> strings; // character blub + // Allocate a string from the internal arena. + const Byte* make_copy(const Byte*, size_t); + }; + + typedef const StringPool::EntryType* InternedString; +} + +#endif // OPENAXIOM_STRING_POOL_INCLUDED diff --git a/src/include/structure.H b/src/include/open-axiom/structure index 33c084f2..33c084f2 100644 --- a/src/include/structure.H +++ b/src/include/open-axiom/structure diff --git a/src/include/token.H b/src/include/open-axiom/token index b57b69d6..b57b69d6 100644 --- a/src/include/token.H +++ b/src/include/open-axiom/token diff --git a/src/include/token-value.def b/src/include/open-axiom/token-value index 9a949b86..9a949b86 100644 --- a/src/include/token-value.def +++ b/src/include/open-axiom/token-value diff --git a/src/include/vm.H b/src/include/open-axiom/vm index 3bb62250..3bb62250 100644 --- a/src/include/vm.H +++ b/src/include/open-axiom/vm |