Advertisement
Guest User

variant.cpp

a guest
Nov 26th, 2015
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #include "variant.h"
  2. #include <algorithm>
  3. #include <cstdlib>
  4.  
  5. Variant::Variant(Type type)
  6.     : type(type)
  7. { }
  8.  
  9. Variant::Variant(Variant::Type type, const std::string& value)
  10.     : type(type)
  11. {
  12.     switch (type) {
  13.     case Type::Int:
  14.         ivalue = std::atoi(value.c_str());
  15.         break;
  16.     case Type::String:
  17.         svalue = value;
  18.         break;
  19.     case Type::Nothing:
  20.         break;
  21.     }
  22. }
  23.  
  24. Variant::Variant(const std::string& value)
  25. {
  26.     if (std::find_if_not(begin(value), end(value), isdigit) != end(value)) {
  27.         type = Type::String;
  28.         svalue = value;
  29.     } else {
  30.         type = Type::Int;
  31.         ivalue = std::atoi(value.c_str());
  32.     }
  33. }
  34.  
  35. Variant Variant::fromInt(int value)
  36. {
  37.     Variant v;
  38.     v.type = Type::Int;
  39.     v.ivalue = value;
  40.     return v;
  41. }
  42.  
  43. Variant Variant::operator+(const Variant& x) const
  44. {
  45.     if (type != x.type) {
  46.         return Variant();
  47.     }
  48.     switch (type) {
  49.     case Type::Int:
  50.         return Variant::fromInt(ivalue + x.ivalue);
  51.     case Type::String:
  52.         return Variant(type, svalue + x.svalue);
  53.     case Type::Nothing:
  54.         return Variant();
  55.     }
  56.     return Variant();
  57. }
  58.  
  59. Variant Variant::operator-(const Variant& x) const
  60. {
  61.     if (type == x.type && type == Type::Int) {
  62.         return Variant::fromInt(ivalue - x.ivalue);
  63.     }
  64.     return Variant();
  65. }
  66.  
  67. Variant Variant::operator*(const Variant& x) const
  68. {
  69.     if (type == Type::Int){
  70.         if (x.type == Type::Int)
  71.             return Variant::fromInt(ivalue * x.ivalue);
  72.         if (x.type == Type::String) {
  73.             Variant v(Type::String);
  74.             for (int i = 0; i < ivalue; i++)
  75.                 v.svalue += x.svalue;
  76.             return v;
  77.         }
  78.     }
  79.     if (type == Type::String && x.type == Type::Int) {
  80.         Variant v(Type::String);
  81.         for (int i = 0; i < x.ivalue; i++)
  82.             v.svalue += svalue;
  83.         return v;
  84.     }
  85.     return Variant();
  86. }
  87.  
  88. Variant Variant::operator/(const Variant& x) const
  89. {
  90.     if (type == x.type && type == Type::Int) {
  91.         return Variant::fromInt(ivalue / x.ivalue);
  92.     }
  93.     return Variant();
  94. }
  95.  
  96. std::string Variant::toString() const
  97. {
  98.     switch (type) {
  99.     case Type::Nothing:
  100. //        return std::string;
  101.         return "!!! error !!!";
  102.     case Type::Int:
  103.         return std::to_string(ivalue);
  104.     case Type::String:
  105.         return svalue;
  106.     default:
  107.         return "!! unknown !!";
  108.         break;
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement