aboutsummaryrefslogtreecommitdiff
path: root/src/value.h
blob: 4a1b2b5806a4394a3c17ddac96c1a4162f5bb2bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright 2018 The Amber Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_VALUE_H_
#define SRC_VALUE_H_

#include <cstdint>

namespace amber {

class Value {
 public:
  Value();
  Value(const Value&);
  ~Value();

  Value& operator=(const Value&);

  void SetIntValue(uint64_t val) {
    type_ = Type::kInteger;
    uint_value_ = val;
  }
  bool IsInteger() const { return type_ == Type::kInteger; }

  void SetDoubleValue(double val) {
    type_ = Type::kFloat;
    double_value_ = val;
  }
  bool IsFloat() const { return type_ == Type::kFloat; }

  uint8_t AsUint8() const { return static_cast<uint8_t>(uint_value_); }
  uint16_t AsUint16() const { return static_cast<uint16_t>(uint_value_); }
  uint32_t AsUint32() const { return static_cast<uint32_t>(uint_value_); }
  uint64_t AsUint64() const { return static_cast<uint64_t>(uint_value_); }

  int8_t AsInt8() const { return static_cast<int8_t>(uint_value_); }
  int16_t AsInt16() const { return static_cast<int16_t>(uint_value_); }
  int32_t AsInt32() const { return static_cast<int32_t>(uint_value_); }
  int64_t AsInt64() const { return static_cast<int64_t>(uint_value_); }

  float AsFloat() const { return static_cast<float>(double_value_); }
  double AsDouble() const { return double_value_; }

 private:
  enum class Type { kFloat, kInteger };
  Type type_ = Type::kFloat;
  uint64_t uint_value_ = 0;
  double double_value_ = 0.0;
};

}  // namespace amber

#endif  // SRC_VALUE_H_