summaryrefslogtreecommitdiff
path: root/common/tools.hh
diff options
context:
space:
mode:
Diffstat (limited to 'common/tools.hh')
-rw-r--r--common/tools.hh80
1 files changed, 80 insertions, 0 deletions
diff --git a/common/tools.hh b/common/tools.hh
new file mode 100644
index 0000000..af8e5e9
--- /dev/null
+++ b/common/tools.hh
@@ -0,0 +1,80 @@
+#ifndef __COMMON_TOOLS_HH__
+#define __COMMON_TOOLS_HH__
+
+#include "lout/object.hh"
+#include "lout/container.hh"
+
+namespace rtfl {
+
+namespace tools {
+
+const char *numSuffix (int n);
+void numToRoman (int num, char *buf, int buflen);
+void syserr (const char *fmt, ...);
+
+class EquivalenceRelation: public lout::object::Object {
+private:
+ class RefTarget: public lout::object::Object {
+ private:
+ bool ownerOfObject;
+ int refCount;
+ lout::object::Object *object;
+ lout::container::untyped::HashSet *allKeys;
+
+ public:
+ RefTarget (lout::object::Object *object, bool ownerOfObject);
+ ~RefTarget ();
+
+ inline lout::object::Object *getObject () { return object; }
+ inline void ref () { refCount++; }
+ inline void unref () { if (--refCount == 0) delete this; }
+
+ inline lout::container::untyped::HashSet *getAllKeys ()
+ { return allKeys; }
+ inline void putKey (Object *key) { allKeys->put (key); }
+ inline void removeKey (Object *key) { allKeys->remove (key); }
+ };
+
+
+ class RefSource: public lout::object::Object {
+ RefTarget *target;
+ lout::object::Object *key;
+
+ void refTarget ();
+ void unrefTarget ();
+
+ public:
+ RefSource (lout::object::Object *key, RefTarget *target);
+ ~RefSource ();
+
+ inline RefTarget *getTarget () { return target; }
+ void setTarget (RefTarget *target);
+ };
+
+ bool ownerOfKeys, ownerOfValues;
+ lout::container::untyped::HashTable *sources;
+
+ lout::container::untyped::HashSet *initSet (lout::object::Object *o);
+
+ public:
+ EquivalenceRelation (bool ownerOfKeys, bool ownerOfValues);
+ ~EquivalenceRelation ();
+
+ void put (lout::object::Object *key, lout::object::Object *value);
+ lout::object::Object *get (lout::object::Object *key) const;
+ bool contains (lout::object::Object *key) const;
+ lout::container::untyped::Iterator iterator ();
+ lout::container::untyped::Iterator relatedIterator (Object *key);
+
+ void relate (lout::object::Object *key1, lout::object::Object *key2);
+ void putRelated (lout::object::Object *oldKey, lout::object::Object *newKey);
+
+ void removeSimple (lout::object::Object *key);
+ void remove (lout::object::Object *key);
+};
+
+} // namespace tools
+
+} // namespace rtfl
+
+#endif // __COMMON_TOOLS_HH__