jsonserial2  2.0
 All Classes Functions Typedefs Enumerations
jsonserial_vector.hpp
1 
2 // JSonSerial2: C++ Object Serialization in JSON
3 // See: https://www.telecom-paris.fr/~elc/software/
4 // This file should be included *after* jsonserial.hpp when serializing std::vector
5 //
6 // Copyright 2020 Eric Lecolinet (eric.lecolinet@gmail.com)
7 //
8 // Licensed under the Apache License, Version 2.0 (the "License");
9 // you may not use this file except in compliance with the License.
10 // You may obtain a copy of the License at
11 //
12 // http://www.apache.org/licenses/LICENSE-2.0
13 //
14 // Unless required by applicable law or agreed to in writing, software
15 // distributed under the License is distributed on an "AS IS" BASIS,
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 // See the License for the specific language governing permissions and
18 // limitations under the License.
19 
20 #ifndef jsonserial_vector_hpp
21 #define jsonserial_vector_hpp
22 #include <vector>
23 namespace jsonserial {
24 
25 template <class T, class Alloc>
26 struct is_std_vector<std::vector<T,Alloc>> : std::true_type {};
27 
28 template <class Alloc>
29 struct is_std_vector<std::vector<bool,Alloc>> : std::true_type {};
30 
31 template<class T>
32 struct JSonArrayImpl<T, typename std::enable_if<is_std_vector<T>::value>::type>
33 : public JSonArray {
34  struct Ptr {size_t index; JObjectPtr* jsp;};
35 
36  JSonArrayImpl(T& cont) : cont_(cont) {cont_.clear();}
37 
38  void add(JSonSerial& js, JSonClass::Creator* cr, JKString& s) override {
39  cont_.resize(cont_.size()+1);
40  JObjectPtr* objptr{};
41  readArrayValue(js, cont_.back(), objptr, cr, s);
42  // TODO: shared pointers when elements in this vector point to an element created in this vector
43  if (objptr && objptr->init_) pointers_.push_back(Ptr{cont_.size()-1, objptr});
44  }
45 
46  void end(JSonSerial&) override {
47  cont_.shrink_to_fit();
48  if (pointers_.size() > 1) fixPointers<T>(cont_, pointers_);
49  }
50 
51  template<class C>
52  static void fixPointers(typename std::enable_if<!is_smart_ptr<typename C::value_type>::value,C>::type &,
53  std::vector<Ptr> &) {}
54 
55  template<class C>
56  static void fixPointers(typename std::enable_if<is_smart_ptr<typename C::value_type>::value,C>::type & cont,
57  std::vector<Ptr> & pointers) {
58  for (auto& it : pointers) it.jsp->shared_ = &cont[it.index];
59  }
60  T& cont_;
61  std::vector<Ptr> pointers_;
62 };
63 
64 }
65 #endif