ledger-core
DynamicArray.hpp
1 /*
2  *
3  * DynamicArray
4  * ledger-core
5  *
6  * Created by Pierre Pollastri on 08/03/2017.
7  *
8  * The MIT License (MIT)
9  *
10  * Copyright (c) 2016 Ledger
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a copy
13  * of this software and associated documentation files (the "Software"), to deal
14  * in the Software without restriction, including without limitation the rights
15  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16  * copies of the Software, and to permit persons to whom the Software is
17  * furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included in all
20  * copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28  * SOFTWARE.
29  *
30  */
31 #ifndef LEDGER_CORE_DYNAMICARRAY_HPP
32 #define LEDGER_CORE_DYNAMICARRAY_HPP
33 
34 #include "../api/DynamicArray.hpp"
35 #include "../api/DynamicObject.hpp"
36 #include "../api/DynamicType.hpp"
37 #include <cereal/cereal.hpp>
38 #include <cereal/types/vector.hpp>
39 #include "../collections/collections.hpp"
40 #include "DynamicValue.hpp"
41 #include <sstream>
42 
43 namespace ledger {
44  namespace core {
45  class DynamicArray : public api::DynamicArray, public std::enable_shared_from_this<DynamicArray> {
46  public:
47  DynamicArray() : _readOnly(false) {};
48 
49  int64_t size() override;
50 
52  template <typename T>
53  optional<T> get(int64_t index) {
54  if (index < size()) {
55  auto v = _values.get(index);
56 
57  if (v) {
58  return v->get<T>();
59  } else {
60  return optional<T>();
61  }
62  } else {
63  return optional<T>();
64  }
65  }
66 
67  optional<std::string> getString(int64_t index) override;
68  optional<int32_t> getInt(int64_t index) override;
69  optional<int64_t> getLong(int64_t index) override;
70  optional<double> getDouble(int64_t index) override;
71  optional<std::vector<uint8_t>> getData(int64_t index) override;
72  optional<bool> getBoolean(int64_t index) override;
73  std::shared_ptr<api::DynamicObject> getObject(int64_t index) override;
74  std::shared_ptr<api::DynamicArray> getArray(int64_t index) override;
75 
77  template <typename T>
78  std::shared_ptr<DynamicArray> push(T value) {
79  if (!_readOnly) {
80  _values += DynamicValue(value);
81  }
82 
83  return shared_from_this();
84  }
85 
86  std::shared_ptr<api::DynamicArray> pushInt(int32_t value) override;
87  std::shared_ptr<api::DynamicArray> pushLong(int64_t value) override;
88  std::shared_ptr<api::DynamicArray> pushString(const std::string &value) override;
89  std::shared_ptr<api::DynamicArray> pushDouble(double value) override;
90  std::shared_ptr<api::DynamicArray> pushData(const std::vector<uint8_t> &value) override;
91  std::shared_ptr<api::DynamicArray> pushBoolean(bool value) override;
92  std::shared_ptr<api::DynamicArray> pushObject(const std::shared_ptr<api::DynamicObject> &value) override;
93  std::shared_ptr<api::DynamicArray> pushArray(const std::shared_ptr<api::DynamicArray> &value) override;
94  std::shared_ptr<api::DynamicArray> concat(const std::shared_ptr<api::DynamicArray> &array) override;
95 
96 
97  bool isReadOnly() override;
98  void setReadOnly(bool enable);
99 
100  optional<api::DynamicType> getType(int64_t index) override;
101  bool remove(int64_t index) override;
102  std::string dump() override;
103  std::vector<uint8_t> serialize() override;
104 
105  std::ostream& dump(std::ostream& ss, int depth) const;
106 
107  template <class Archive>
108  void serialize(Archive& ar) {
109  ar(_values.getContainer());
110  }
111 
112  private:
113  Array<DynamicValue> _values;
114  bool _readOnly;
115  };
116  }
117 }
118 
119 #endif //LEDGER_CORE_DYNAMICARRAY_HPP
std::shared_ptr< DynamicArray > push(T value)
A generic and type-safe push.
Definition: DynamicArray.hpp:78
Definition: DynamicArray.hpp:26
std::shared_ptr< api::DynamicObject > getObject(int64_t index) override
Definition: DynamicArray.cpp:72
optional< double > getDouble(int64_t index) override
Definition: DynamicArray.cpp:60
int64_t size() override
Definition: DynamicArray.cpp:44
optional< std::vector< uint8_t > > getData(int64_t index) override
Definition: DynamicArray.cpp:68
bool isReadOnly() override
Definition: DynamicArray.cpp:174
optional< bool > getBoolean(int64_t index) override
Definition: DynamicArray.cpp:64
std::shared_ptr< api::DynamicArray > pushLong(int64_t value) override
Definition: DynamicArray.cpp:84
optional< api::DynamicType > getType(int64_t index) override
Definition: DynamicArray.cpp:112
Definition: DynamicArray.hpp:45
optional< int64_t > getLong(int64_t index) override
Definition: DynamicArray.cpp:56
optional< int32_t > getInt(int64_t index) override
Definition: DynamicArray.cpp:52
std::shared_ptr< api::DynamicArray > getArray(int64_t index) override
Definition: DynamicArray.cpp:76
Definition: DynamicValue.hpp:48
std::shared_ptr< api::DynamicArray > pushData(const std::vector< uint8_t > &value) override
Definition: DynamicArray.cpp:100
optional< std::string > getString(int64_t index) override
Definition: DynamicArray.cpp:48
std::vector< uint8_t > serialize() override
Definition: DynamicArray.cpp:153
std::shared_ptr< api::DynamicArray > pushBoolean(bool value) override
Definition: DynamicArray.cpp:92
Definition: Account.cpp:8
std::shared_ptr< api::DynamicArray > pushDouble(double value) override
Definition: DynamicArray.cpp:88
std::shared_ptr< api::DynamicArray > pushString(const std::string &value) override
Definition: DynamicArray.cpp:96
Definition: optional.hpp:177
std::string dump() override
Definition: DynamicArray.cpp:132
std::shared_ptr< api::DynamicArray > pushInt(int32_t value) override
Definition: DynamicArray.cpp:80
Definition: Sequence.hpp:42