Classdesc 3.44
random_init_epilogue.h
1/*
2 @copyright Russell Standish 2000-2014
3 @author Russell Standish
4 This file is part of Classdesc
5
6 Open source licensed under the MIT license. See LICENSE for details.
7*/
8
9#ifndef CLASSDESC_RANDOM_INIT_EPILOGUE_H
10#define CLASSDESC_RANDOM_INIT_EPILOGUE_H
11#include "classdesc.h"
12#include "random_init-allCDs.h"
13
14namespace classdesc_access
15{
16 namespace cd=classdesc;
17 template <class T>
18 struct access_random_init<const T>
19 {
20 void operator()(classdesc::random_init_t&,const classdesc::string&,const T&a)
21 {/* nothing to do */}
22 };
23
24 template<class T> typename
25 cd::enable_if<cd::is_default_constructible<typename T::element_type>, void>::T
26 random_init_smart_ptr(cd::random_init_t& r, const cd::string& d,
27 T& a, cd::dummy<0> dum=0)
28 {
29 a.reset(new typename T::element_type);
30 random_init(r,d,*a);
31 }
32
33 template<class T> typename
34 cd::enable_if<
35 cd::Not<cd::is_default_constructible<typename T::element_type> >, void>::T
36 random_init_smart_ptr(cd::random_init_t& r, const cd::string& d,
37 T& a, cd::dummy<1> dum=0)
38 {
39 if (a.get())
40 random_init(r,d,*a);
41 }
42
43 template <class T>
44 struct access_random_init<cd::shared_ptr<T> >
45 {
46 void operator()(cd::random_init_t& x, const cd::string& d,
47 cd::shared_ptr<T>& a)
48 {random_init_smart_ptr(x,d,a);}
49 };
50
51#if defined(__cplusplus) && __cplusplus<=201402
52#if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__)
53#pragma GCC diagnostic push
54#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
55#endif
56 template <class T>
57 struct access_random_init<std::auto_ptr<T> >
58 {
59 void operator()(cd::random_init_t& x, const cd::string& d,
60 std::auto_ptr<T>& a)
61 {random_init_smart_ptr(x,d,a);}
62 };
63#if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__)
64#pragma GCC diagnostic pop
65#endif
66#endif
67
68#if defined(__cplusplus) && __cplusplus >= 201103L
69 template <class T, class D>
70 struct access_random_init<std::unique_ptr<T,D> >
71 {
72 void operator()(cd::random_init_t& x, const cd::string& d,
73 std::unique_ptr<T,D>& a)
74 {json_pack_smart_ptr(x,d,a);}
75 };
76
77#endif
78
79
80#ifdef CLASSDESC_POLYPACKBASE_H
81 template <> struct access_random_init<cd::PolyPackBase>:
82 public cd::NullDescriptor<cd::random_init_t> {};
83 template <class T> struct access_random_init<cd::PolyPack<T> >:
84 public cd::NullDescriptor<cd::random_init_t> {};
85#endif
86
87#ifdef CLASSDESC_POLYJSONBASE_H
88 template <> struct access_random_init<cd::PolyJsonBase>:
89 public cd::NullDescriptor<cd::random_init_t> {};
90 template <class T> struct access_random_init<cd::PolyJson<T> >:
91 public cd::NullDescriptor<cd::random_init_t> {};
92#endif
93
94//#ifdef CLASSDESC_POLYXMLBASE_H
95// template <> struct access_random_init<cd::PolyXMLBase>:
96// public cd::NullDescriptor<cd::random_init_t> {};
97// template <class T> struct access_random_init<cd::PolyXML<T> >:
98// public cd::NullDescriptor<cd::random_init_t> {};
99//#endif
100
101
102
103}
104
105namespace classdesc
106{
107 template <class T>
109 public Not< Or< Or< Or<is_arithmetic<T>,is_string<T> >, is_sequence<T> >,
110 is_associative_container<T> > >
111 {};
112
113 template <class T> typename
115 random_initp(random_init_t& r,const string& d,T& a, dummy<3> dum=0)
117
118 // by default, do nothing
119 template <class T> void random_init_normalise(T&) {}
120
121 template <class T>
122 void random_init(random_init_t& r,const string& d,T& a)
123 {
124 random_initp(r,d,a);
126 }
127}
128#endif
Definition random_init_base.h:21
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
void random_init_normalise(T &)
Definition random_init_epilogue.h:119
STL namespace.
Definition random_init_epilogue.h:111
Definition classdesc.h:405
helper for constructing null descriptors
Definition classdesc.h:1106
Definition classdesc.h:299
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Definition classdesc_access.h:27