Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. class Token {
  2. public:
  3. enum class Type : uint8_t {
  4. UNKNOWN = 0,
  5. FIELD = 1,
  6.  
  7. // Logical operators
  8. AND = 2,
  9. OR = 3,
  10.  
  11. // Relational operators
  12. NEQ = 4,
  13. GT = 5,
  14. LT = 6,
  15.  
  16. // Parentheses
  17. LP = 7,
  18. RP = 8
  19. };
  20.  
  21. public:
  22. Token() noexcept;
  23. Token(Token&& other) = default;
  24. Token(Token const& other) = default;
  25. Token(Type const type) noexcept;
  26.  
  27. Token& operator=(Token&& other) = default;
  28. Token& operator=(Token const& other) = default;
  29. bool operator==(Token const& other) const noexcept;
  30.  
  31. virtual ~Token() = default;
  32.  
  33. virtual void type(Type const type) noexcept;
  34. Type type() const noexcept;
  35.  
  36. bool is(Type const type) const noexcept;
  37. bool is_not(Type const type) const noexcept;
  38. bool is_one_of(Type const type1, Type const type2) const noexcept;
  39.  
  40. template <typename... Types>
  41. bool is_one_of(Type const type1, Type const type2, Types const ... types) const noexcept;
  42.  
  43. static std::unordered_map<std::string, Type> type_expressions() noexcept;
  44.  
  45. private:
  46. Type type_;
  47. };
  48.  
  49. template <typename... Types>
  50. bool Token::is_one_of(Type const type1, Type const type2, Types const ... types) const noexcept {
  51. return is(type1) || is_one_of(type2, types...);
  52. }
  53.  
  54. Token::Token() noexcept
  55. : type_(Type::UNKNOWN)
  56. {}
  57.  
  58. Token::Token(Type const type) noexcept
  59. : type_(type)
  60. {}
  61.  
  62. bool Token::operator==(Token const& other) const noexcept {
  63. return type_ == other.type_;
  64. }
  65.  
  66. void Token::type(Type const type) noexcept {
  67. type_ = type;
  68. }
  69.  
  70. Token::Type Token::type() const noexcept {
  71. return type_;
  72. }
  73.  
  74. bool Token::is(Type const type) const noexcept {
  75. return type_ == type;
  76. }
  77.  
  78. bool Token::is_not(Type const type) const noexcept {
  79. return type_ != type;
  80. }
  81.  
  82. bool Token::is_one_of(Type const type1, Type const type2) const noexcept {
  83. return is(type1) || is(type2);
  84. }
  85.  
  86. std::unordered_map<std::string, Token::Type> Token::type_expressions() noexcept {
  87. static std::unordered_map<std::string, Type> type_expressions = {
  88. { "and", Type::AND },
  89. { "&&" , Type::AND },
  90. { "or" , Type::OR },
  91. { "||" , Type::OR },
  92. { "neq", Type::NEQ },
  93. { "!=" , Type::NEQ },
  94. { "greater", Type::GT },
  95. { ">", Type::GT },
  96. { "less", Type::LT },
  97. { "<", Type::LT },
  98. { "(", Type::LP },
  99. { ")", Type::RP }
  100. };
  101. return type_expressions;
  102. }
  103.  
  104. template <typename FieldType = std::string>
  105. class FieldToken : public Token {
  106. public:
  107. FieldToken() noexcept;
  108. FieldToken(FieldToken&& other) = default;
  109. FieldToken(FieldToken const& other) = default;
  110. FieldToken(FieldType const& field) noexcept;
  111.  
  112. FieldToken& operator=(FieldToken&& other) = default;
  113. FieldToken& operator=(FieldToken const& other) = default;
  114. bool operator==(FieldToken const& other) const noexcept;
  115.  
  116. virtual ~FieldToken() = default;
  117.  
  118. void type(Type const type) noexcept override;
  119.  
  120. void field(FieldType const& field) noexcept;
  121. FieldType const& field() const noexcept;
  122.  
  123. private:
  124. template <typename T>
  125. void ignore(T&&);
  126.  
  127. private:
  128. FieldType field_;
  129. };
  130.  
  131. template <typename FieldType>
  132. FieldToken<FieldType>::FieldToken() noexcept
  133. : Token(Token::Type::FIELD),
  134. field_{}
  135. {}
  136.  
  137. template <typename FieldType>
  138. FieldToken<FieldType>::FieldToken(FieldType const& field) noexcept
  139. : Token(Token::Type::FIELD),
  140. field_(field)
  141. {}
  142.  
  143. template <typename FieldType>
  144. void FieldToken<FieldType>::type(Type const type) noexcept {
  145. ignore(type);
  146. Token::type(Token::Type::FIELD);
  147. }
  148.  
  149. template <typename FieldType>
  150. void FieldToken<FieldType>::field(FieldType const& field) noexcept {
  151. field_ = field;
  152. }
  153.  
  154. template <typename FieldType>
  155. FieldType const& FieldToken<FieldType>::field() const noexcept {
  156. return field_;
  157. }
  158.  
  159. template <typename FieldType>
  160. template <typename T>
  161. void FieldToken<FieldType>::ignore(T&&)
  162. {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement