Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

Token.h

Go to the documentation of this file.
00001 #ifndef TOKEN_H_
00002 #define TOKEN_H_
00003 
00004 // C++ Library 
00005 #include <string>
00006 
00007 namespace Kodu {
00008 // ===================== Token Class Definitions ========================== //
00009     class TokenBase {
00010     public:
00011         //! Constructor
00012         TokenBase() {
00013             // no explicit implementation
00014         }
00015 
00016         //! Copy constructor
00017         explicit TokenBase(const TokenBase& kToken) {
00018             // no explicit implementation
00019         }
00020 
00021         //! Destructor
00022         virtual ~TokenBase() {
00023             // no explicit implementation
00024         }
00025 
00026         //! Assignment operator
00027         TokenBase& operator=(const TokenBase& kToken) {
00028             return *this;
00029         }
00030         
00031         bool isKeywordToken() const;
00032 
00033         //! Returns whether or not an instance is a string token
00034         bool isStringToken() const;
00035         
00036         //! Returns whether or not an instance is a numeric token
00037         bool isNumericToken() const;
00038         
00039         const std::string& getKeywordData() const;
00040 
00041         //! Returns the string data of a StringToken instance
00042         const std::string& getStringData() const;
00043         
00044         //! Returns the numeric data of a NumericToken instance
00045         const float& getNumericData() const;
00046     };
00047 
00048     //! Token Super Class
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     // Specializations
00106     //! Token<std::string>
00107     TOKEN_SUPER_CLASS(std::string);
00108 
00109     //! Token<float>
00110     TOKEN_SUPER_CLASS(float);
00111 
00112     //! KeywordToken
00113     TOKEN_DERIVED_CLASS(KeywordToken, Token<std::string>, std::string);
00114 
00115     //! NumericToken
00116     TOKEN_DERIVED_CLASS(NumericToken, Token<float>, float);
00117 
00118     //! StringToken
00119     TOKEN_DERIVED_CLASS(StringToken, Token<std::string>, std::string);
00120 
00121 // ======================================================================== //
00122 }
00123 
00124 #endif // TOKEN_H_

Tekkotsu v5.1CVS
Generated Mon May 9 04:58:52 2016 by Doxygen 1.6.3