aboutsummaryrefslogtreecommitdiff
path: root/src/utils/string-pool.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/string-pool.H')
-rw-r--r--src/utils/string-pool.H88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/utils/string-pool.H b/src/utils/string-pool.H
new file mode 100644
index 00000000..f3692a79
--- /dev/null
+++ b/src/utils/string-pool.H
@@ -0,0 +1,88 @@
+// 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_STRING_POOL_INCLUDED
+#define OPENAXIOM_STRING_POOL_INCLUDED
+
+#include <string.h>
+#include "hash-table.H"
+
+// --% 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 char* begin() const { return text; }
+ const char* end() const { return text + length; }
+ size_t size() const { return length; }
+ bool equal(const char*, size_t) const;
+ protected:
+ const char* text; // pointer to the byte sequence
+ size_t length; // number of bytes in this string
+ friend class StringPool;
+ StringItem() : text(), length() { }
+ };
+
+ // ----------------
+ // -- StringPool --
+ // ----------------
+ // A stringpool object is a repository of long-living string objects.
+ // It contains no duplicates, therefore allowing fast string
+ // object comparison for equality.
+ struct StringPool : private BasicHashTable<StringItem> {
+ using BasicHashTable<StringItem>::EntryType;
+
+ StringPool();
+ // Intern a NUL-terminated sequence of characters.
+ EntryType* intern(const char* s) {
+ return intern(s, strlen(s));
+ }
+
+ // Intern a sequence of characters given by its start and length.
+ EntryType* intern(const char*, size_t);
+ private:
+ Memory::Arena<char> strings; // character blub
+ // Allocate a string from the internal arena.
+ const char* make_copy(const char*, size_t);
+ };
+
+ typedef const StringPool::EntryType* BasicString;
+}
+
+#endif // OPENAXIOM_STRING_POOL_INCLUDED