operation.hxx
Go to the documentation of this file.
1 /*===========================================================================================================
2  *
3  * SHA-L - Simple Hybesis Algorithm Logger
4  *
5  * Copyright (c) Michael Jeulin-Lagarrigue
6  *
7  * Licensed under the MIT License, you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * https://github.com/michael-jeulinl/Simple-Hybesis-Algorithms-Logger/blob/master/LICENSE
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License is
13  * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and limitations under the License.
15  *
16  * The above copyright notice and this permission notice shall be included in all copies or
17  * substantial portions of the Software.
18  *
19  *=========================================================================================================*/
20 #ifndef MODULE_LOGGER_OPERATION_HXX
21 #define MODULE_LOGGER_OPERATION_HXX
22 
23 #include <Logger/typedef.hxx>
24 #include <Logger/value_type.hxx>
25 
26 namespace SHA_Logger
27 {
28  namespace
29  {
30  static const std::string kTypeName = "operation"; // Name used as type for all operations name
31  }
32 
35  class Operation
36  {
37  public:
38  // Assert correct JSON construction.
39  ~Operation() { assert(this->writer->IsComplete()); }
40 
48  template <typename T>
49  static Ostream& Set(Ostream& os, const String& name, const T& value)
50  {
51  std::unique_ptr<Operation> builder = std::unique_ptr<Operation>(new Operation(os));
52  builder->WriteSet(name, value);
53 
54  return os;
55  }
56 
58  template <typename T>
59  static Ostream& Return(Ostream& os, const T& value)
60  {
61  std::unique_ptr<Operation> builder = std::unique_ptr<Operation>(new Operation(os));
62  builder->WriteReturn(value);
63 
64  return os;
65  }
66 
68  template <typename T>
69  static Ostream& OffSet(Ostream& os, const String& name, const T& offset)
70  {
71  std::unique_ptr<Operation> builder = std::unique_ptr<Operation>(new Operation(os));
72  builder->WriteOffSet(name, offset);
73 
74  return os;
75  }
76 
78 
79  static Ostream& Swap(Ostream& os, const String& aName, const String& bName)
80  {
81  std::unique_ptr<Operation> builder = std::unique_ptr<Operation>(new Operation(os));
82  builder->WriteSwap(aName, bName);
83 
84  return os;
85  }
86 
91  template <typename T>
92  static Writer& Set(Writer& writer, const String& name, const T& value)
93  {
94  WriteSet(writer, name, value);
95 
96  return writer;
97  }
98 
100  template <typename T>
101  static Writer& Return(Writer& writer, const T& value)
102  {
103  WriteReturn(writer, value);
104 
105  return writer;
106  }
107 
109  template <typename T>
110  static Writer& OffSet(Writer& writer, const String& name, const T& offset)
111  {
112  WriteOffSet(writer, name, offset);
113 
114  return writer;
115  }
116 
118  static Writer& Swap(Writer& writer, const String& aName, const String& bName)
119  {
120  WriteSwap(writer, aName, bName);
121 
122  return writer;
123  }
124 
125  private:
126  Operation(Ostream& os) : stream(std::unique_ptr<Stream>(new Stream(os))),
127  writer(std::unique_ptr<Writer>(new Writer(*this->stream))) {}
128  Operation operator=(Operation&) {} // Not Implemented
129 
130  template <typename T>
131  bool WriteSet(const String& name, const T& value)
132  { return WriteSet(*this->writer, name, value); }
133 
134  template <typename T>
135  bool WriteOffSet(const String& name, const T& offset)
136  { return WriteOffSet(*this->writer, name, offset); }
137 
138  template <typename T>
139  bool WriteReturn(const T& value)
140  { return WriteReturn(*this->writer, value); }
141 
142  bool WriteSwap(const String& aName, const String& bName)
143  { return WriteSwap(*this->writer, aName, bName); }
144 
145  template <typename T>
146  static bool WriteSet(Writer& writer, const String& name, const T& value)
147  {
148  writer.StartObject();
149  writer.Key("type");
150  writer.String(kTypeName);
151  writer.Key("name");
152  writer.String("Set");
153  writer.Key("ref");
154  writer.String(name);
155  writer.Key("data");
156  ValueType::Build<T>(writer, value);
157  writer.EndObject();
158 
159  return true;
160  }
161 
162  template <typename T>
163  static bool WriteOffSet(Writer& writer, const String& name, const T& offset)
164  {
165  writer.StartObject();
166  writer.Key("type");
167  writer.String(kTypeName);
168  writer.Key("name");
169  writer.String("OffSet");
170  writer.Key("ref");
171  writer.String(name);
172  writer.Key("data");
173  ValueType::Build<T>(writer, offset);
174  writer.EndObject();
175 
176  return true;
177  }
178 
179  template <typename T>
180  static bool WriteReturn(Writer& writer, const T& value)
181  {
182  writer.StartObject();
183  writer.Key("type");
184  writer.String(kTypeName);
185  writer.Key("name");
186  writer.String("Return");
187  writer.Key("data");
188  ValueType::Build<T>(writer, value);
189  writer.EndObject();
190 
191  return true;
192  }
193 
194  static bool WriteSwap(Writer& writer, const String& aName, const String& bName)
195  {
196  writer.StartObject();
197  writer.Key("type");
198  writer.String(kTypeName);
199  writer.Key("name");
200  writer.String("Swap");
201  writer.Key("refA");
202  writer.String(aName);
203  writer.Key("refB");
204  writer.String(bName);
205  writer.EndObject();
206 
207  return true;
208  }
209 
210  std::unique_ptr<Stream> stream; // Stream wrapper
211  std::unique_ptr<Writer> writer; // Writer used to fill the stream
212  };
213 }
214 
215 #endif // MODULE_LOGGER_OPERATION_HXX
static Writer & Return(Writer &writer, const T &value)
Definition: operation.hxx:101
static bool WriteSet(Writer &writer, const String &name, const T &value)
Definition: operation.hxx:146
bool WriteSet(const String &name, const T &value)
Definition: operation.hxx:131
static Writer & Swap(Writer &writer, const String &aName, const String &bName)
Definition: operation.hxx:118
Operation(Ostream &os)
Definition: operation.hxx:126
static bool WriteOffSet(Writer &writer, const String &name, const T &offset)
Definition: operation.hxx:163
const std::string String
Definition: typedef.hxx:36
static Ostream & Return(Ostream &os, const T &value)
Definition: operation.hxx:59
bool WriteSwap(const String &aName, const String &bName)
Definition: operation.hxx:142
std::unique_ptr< Stream > stream
Definition: operation.hxx:210
static Ostream & OffSet(Ostream &os, const String &name, const T &offset)
Definition: operation.hxx:69
static bool WriteReturn(Writer &writer, const T &value)
Definition: operation.hxx:180
static Writer & OffSet(Writer &writer, const String &name, const T &offset)
Definition: operation.hxx:110
std::unique_ptr< Writer > writer
Definition: operation.hxx:211
bool WriteOffSet(const String &name, const T &offset)
Definition: operation.hxx:135
Operation operator=(Operation &)
Definition: operation.hxx:128
rapidjson::OStreamWrapper Stream
Definition: typedef.hxx:32
static Writer & Set(Writer &writer, const String &name, const T &value)
Definition: operation.hxx:92
static bool WriteSwap(Writer &writer, const String &aName, const String &bName)
Definition: operation.hxx:194
bool WriteReturn(const T &value)
Definition: operation.hxx:139
std::ostream Ostream
Definition: typedef.hxx:37
rapidjson::PrettyWriter< Stream > Writer
Definition: typedef.hxx:33
static Ostream & Swap(Ostream &os, const String &aName, const String &bName)
Definition: operation.hxx:79
static Ostream & Set(Ostream &os, const String &name, const T &value)
Definition: operation.hxx:49