Token.h
Go to the documentation of this file.00001 #ifndef TOKEN_H_
00002 #define TOKEN_H_
00003
00004
00005 #include <string>
00006
00007 namespace Kodu {
00008
00009 class TokenBase {
00010 public:
00011
00012 TokenBase() {
00013
00014 }
00015
00016
00017 explicit TokenBase(const TokenBase& kToken) {
00018
00019 }
00020
00021
00022 virtual ~TokenBase() {
00023
00024 }
00025
00026
00027 TokenBase& operator=(const TokenBase& kToken) {
00028 return *this;
00029 }
00030
00031 bool isKeywordToken() const;
00032
00033
00034 bool isStringToken() const;
00035
00036
00037 bool isNumericToken() const;
00038
00039 const std::string& getKeywordData() const;
00040
00041
00042 const std::string& getStringData() const;
00043
00044
00045 const float& getNumericData() const;
00046 };
00047
00048
00049 template<typename DataType> class Token;
00050
00051 #define TOKEN_SUPER_CLASS(DataType) \
00052 template<> \
00053 class Token<DataType> : public TokenBase { \
00054 public: \
00055 explicit Token<DataType>(const DataType& kData) \
00056 : TokenBase(), \
00057 data(kData) \
00058 { } \
00059 \
00060 explicit Token<DataType>(const Token<DataType>& kToken) \
00061 : TokenBase(kToken), \
00062 data(kToken.data) \
00063 { } \
00064 \
00065 virtual ~Token<DataType>() { } \
00066 \
00067 Token<DataType>& operator=(const Token<DataType>& kToken) { \
00068 if (this != &kToken) { \
00069 TokenBase::operator=(kToken); \
00070 data = kToken.data; \
00071 } \
00072 return *this; \
00073 } \
00074 \
00075 const DataType& getData() const { \
00076 return data; \
00077 } \
00078 \
00079 protected: \
00080 DataType data; \
00081 };
00082
00083
00084 #define TOKEN_DERIVED_CLASS(DerivedClassName, SuperClassName, DataType) \
00085 class DerivedClassName : public SuperClassName { \
00086 public: \
00087 explicit DerivedClassName(const DataType& kData) \
00088 : SuperClassName(kData) \
00089 { } \
00090 \
00091 explicit DerivedClassName(const DerivedClassName& kToken) \
00092 : SuperClassName(kToken) \
00093 { } \
00094 \
00095 ~DerivedClassName() { } \
00096 \
00097 DerivedClassName& operator=(const DerivedClassName& kToken) { \
00098 if (this != &kToken) { \
00099 SuperClassName::operator=(kToken); \
00100 } \
00101 return *this; \
00102 } \
00103 };
00104
00105
00106
00107 TOKEN_SUPER_CLASS(std::string);
00108
00109
00110 TOKEN_SUPER_CLASS(float);
00111
00112
00113 TOKEN_DERIVED_CLASS(KeywordToken, Token<std::string>, std::string);
00114
00115
00116 TOKEN_DERIVED_CLASS(NumericToken, Token<float>, float);
00117
00118
00119 TOKEN_DERIVED_CLASS(StringToken, Token<std::string>, std::string);
00120
00121
00122 }
00123
00124 #endif // TOKEN_H_