summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/symbol.h
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
committerKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
commitbab45528d65eaafe68a705dbb2a57075c7b7cbd8 (patch)
tree10b4ae2b5195c8dede153ab89359ec00f55f325f /Build/source/utils/asymptote/symbol.h
parent8643d90372e9c31e0f461c15c596b60a545bd7d3 (diff)
asymptote 1.72 sources (not integrated into build yet)
git-svn-id: svn://tug.org/texlive/trunk@13110 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/symbol.h')
-rw-r--r--Build/source/utils/asymptote/symbol.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/symbol.h b/Build/source/utils/asymptote/symbol.h
new file mode 100644
index 00000000000..e630c5a99b1
--- /dev/null
+++ b/Build/source/utils/asymptote/symbol.h
@@ -0,0 +1,91 @@
+/*****
+ * symbol.h
+ * Andy Hammerlindl 2002/06/18
+ *
+ * Creates symbols from strings so that multiple calls for a symbol of
+ * the same string will return a pointer to the same object.
+ *****/
+
+#ifndef SYMBOL_H
+#define SYMBOL_H
+
+#include <iostream>
+#include <cassert>
+
+#include "common.h"
+
+using std::ostream;
+
+namespace sym {
+
+struct GCInit {
+#ifdef _AIX
+ typedef char * GC_PTR;
+#endif
+ GCInit() {
+#ifdef USEGC
+ GC_set_free_space_divisor(2);
+ GC_dont_expand=0;
+ GC_INIT();
+#endif
+ }
+};
+
+struct symbol {
+ static GCInit initialize;
+private:
+ string name;
+
+public:
+ static mem::map<CONST string,symbol> dict;
+
+ static symbol *specialTrans(string s) {
+ assert(dict.find(s) == dict.end());
+ return &(dict[s]=symbol(s,true));
+ }
+
+ symbol() : special(false) {}
+ symbol(string name, bool special=false)
+ : name(name), special(special) {}
+
+public:
+ friend class mem::map<CONST string,symbol>;
+ bool special; // NOTE: make this const (later).
+
+ static symbol *initsym;
+ static symbol *castsym;
+ static symbol *ecastsym;
+
+ static symbol *literalTrans(string s) {
+ if (dict.find(s) != dict.end())
+ return &dict[s];
+ else
+ return &(dict[s]=symbol(s));
+ }
+
+ static symbol *opTrans(string s) {
+ return literalTrans("operator "+s);
+ }
+
+ static symbol *trans(string s) {
+ // Figure out whether it's an operator or an identifier by looking at the
+ // first character.
+ char c=s[0];
+ return isalpha(c) || c == '_' ? literalTrans(s) : opTrans(s);
+ }
+
+ // Make a symbol that is guaranteed to be unique. It will not match any other
+ // symbol in the namespace.
+ static symbol *gensym(string s) {
+ return new symbol("gensym "+s);
+ }
+
+ operator string () { return string(name); }
+
+ friend ostream& operator<< (ostream& out, const symbol& sym)
+ { return out << sym.name; }
+};
+
+} // namespace sym
+
+#endif