00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __LITERAL_HPP
00014 #define __LITERAL_HPP
00015 #include <basix/port.hpp>
00016 #include <basix/symbol.hpp>
00017
00019
00020 namespace mmx {
00021
00022
00023
00024
00025
00026 class literal {
00027 MMX_ALLOCATORS
00028 string s;
00029 symbol<string> sym;
00030 public:
00031 inline string operator * () const { return s; }
00032 inline friend string as_string (const literal& l) { return l.s; }
00033 inline friend symbol<string> as_symbol (const literal& s) { return s.sym; }
00034 inline literal (): s (""), sym (s) {}
00035 inline literal (const char *s2): s (string (s2)), sym (s) {}
00036 inline literal (const string& s2): s (s2), sym (s) {}
00037 inline literal (const literal& l): s (l.s), sym (l.sym) {}
00038 inline literal (const symbol<string>& sym2): s (*sym2), sym (sym2) {}
00039 };
00040
00041 inline nat hash (const literal& c) { return hash (as_symbol (c)); }
00042 inline nat exact_hash (const literal& c) { return exact_hash (as_symbol (c)); }
00043 inline nat hard_hash (const literal& c) { return hard_hash (as_string (c)); }
00044 inline bool operator == (const literal& c1, const literal& c2) {
00045 return as_symbol (c1) == as_symbol (c2); }
00046 inline bool operator != (const literal& c1, const literal& c2) {
00047 return as_symbol (c1) != as_symbol (c2); }
00048 inline bool exact_eq (const literal& c1, const literal& c2) {
00049 return exact_eq (as_symbol (c1), as_symbol (c2)); }
00050 inline bool exact_neq (const literal& c1, const literal& c2) {
00051 return exact_neq (as_symbol (c1), as_symbol (c2)); }
00052 inline bool hard_eq (const literal& c1, const literal& c2) {
00053 return hard_eq (as_string (c1), as_string (c2)); }
00054 inline bool hard_neq (const literal& c1, const literal& c2) {
00055 return hard_neq (as_string (c1), as_string (c2)); }
00056
00057 template<typename C> C
00058 make_literal (const literal& lit) {
00059 return C (as_string (lit));
00060 }
00061
00062 string literal_to_string (const generic& g);
00063 syntactic flatten (const literal& s);
00064
00065 template<>
00066 struct binary_helper<literal>: public void_binary_helper<literal> {
00067 static inline string short_type_name () { return "L"; }
00068 static inline generic full_type_name () { return "Literal"; }
00069 static inline generic disassemble (const literal& x) {
00070 return as<generic> (*x); }
00071 static inline literal assemble (const generic& x) {
00072 return literal (as<string> (x)); }
00073 static inline void write (const port& out, const literal& l) {
00074 binary_write<string> (out, as_string (l)); }
00075 static inline literal read (const port& in) {
00076 return literal (binary_read<string> (in)); }
00077 };
00078
00079 bool is_literal_string (const literal& l);
00080 bool is_literal_int (const literal& l);
00081 bool is_literal_double (const literal& l);
00082 string as_literal_string (const literal& l);
00083 int as_literal_int (const literal& l);
00084 double as_literal_double (const literal& l);
00085
00086 }
00087 #endif // __LITERAL_HPP