OSDN Git Service

* syntax treeを表現するためのクラス追加。syntax treeはそのまま構文データとしても利用される。
[simplecms/utakata.git] / datum_id.h
1 #ifndef _DATUM_ID_H_
2 #define _DATUM_ID_H_
3
4 // datumで示される構文データの各ID
5
6 namespace utakata {
7
8     namespace datum {
9
10         class DatumID
11         {
12         public:
13             enum private_DATUMID_ {
14                 STRING,               // <string>
15                 BACKQUOTE,            // `
16                 QUOTE,                // '
17                 UNQUOTE,              // ,
18                 UNQUOTESPLICING,      // ,@
19                 SYNTAX,               // #'
20                 QUASISYNTAX,          // #`
21                 UNSYNTAX,             // #,
22                 UNSYNTAXSPLICING,     // #,@
23                 SYMBOL,               // <symbol>
24                 NUMBER,               // <number>
25                 CHARACTOR,            // <charactor>
26                 BOOLEAN,              // <boolean>
27                 BYTEVECTOR,           // <bytevector>
28                 VECTOR,               // <vector>
29                 LIST,                 // <list>
30             };
31
32         private:
33
34             typedef private_DATUMID_ DATUMID_;
35             DATUMID_ S_;
36
37             template<DATUMID_> class Literal;
38
39         public:
40
41             template<DATUMID_ S>
42             DatumID(const Literal<S>&) : S_(S) {}
43
44             DATUMID_ toEnum() const {return S_;}
45
46             friend bool operator==(DatumID s, DatumID t) {return s.S_ == t.S_;}
47             friend bool operator!=(DatumID s, DatumID t) {return !(s == t);}
48
49             static const Literal<STRING>           string;
50             static const Literal<BACKQUOTE>        backquote;
51             static const Literal<QUOTE>            quote;
52             static const Literal<UNQUOTE>          unquote;
53             static const Literal<UNQUOTESPLICING>  unquoteSplicing;
54             static const Literal<SYNTAX>           syntax;
55             static const Literal<QUASISYNTAX>      quasiSyntax;
56             static const Literal<UNSYNTAX>         unsyntax;
57             static const Literal<UNSYNTAXSPLICING> unsyntaxSplicing;
58             static const Literal<SYMBOL>           symbol;
59             static const Literal<NUMBER>           number;
60             static const Literal<CHARACTOR>        charactor;
61             static const Literal<BOOLEAN>          boolean;
62             static const Literal<BYTEVECTOR>       byteVector;
63             static const Literal<VECTOR>           vector;
64         };
65
66         // 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
67         template<DatumID::private_LEXEMEID_ S>
68         class DatumID::Literal : private DatumID
69         {
70         public:
71
72             DatumID::private_LEXEMEID_ toEnum() const {return S;}
73
74         private:
75
76             friend class DatumID;
77             // 暗黙的なコピーコンストラクタを利用する。
78             Literal() : DatumID(*this) {}
79             ~Literal() {}
80
81             void* operator new(size_t);
82             void operator delete(void*);
83             void operator=(const Literal&);
84             void* operator&() const;
85         };
86
87     };
88
89 };
90
91 #endif /* _DATUM_ID_H_ */