varz_value.h
1 // Copyright 2018, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 #pragma once
5 
6 #include <string>
7 #include <vector>
8 
9 namespace util {
10 
11 class VarzValue {
12  public:
13  typedef std::vector<std::pair<std::string, VarzValue>> Map;
14 
15 
16  // Should be union but too complicated to code it in c++11.
17  int64_t num;
18  double dbl;
19  Map key_value_array;
20  std::string str;
21 
22  enum Type { NUM, STRING, MAP, DOUBLE, TIME } type;
23 
24  VarzValue(std::string s) : str(std::move(s)), type(STRING) {
25  }
26 
27  VarzValue(Map s) : key_value_array(std::move(s)), type(MAP) {
28  }
29 
30  VarzValue(const VarzValue&) = default;
31 
32  VarzValue& operator=(const VarzValue&) = default;
33 
34  static VarzValue FromTime(time_t t) {
35  return VarzValue{t, TIME};
36  }
37 
38  static VarzValue FromDouble(double d) {
39  return VarzValue{d};
40  }
41 
42  static VarzValue FromInt(int64_t n) {
43  return VarzValue{n, NUM};
44  }
45 
46  private:
47  VarzValue(int64_t n, Type t) : num(n), type(t) {}
48  VarzValue(double d) : dbl(d), type(DOUBLE) {}
49 };
50 
51 } // namespace util