Classdesc 3.44
random_init_base.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_BASE_H
10#define CLASSDESC_RANDOM_INIT_BASE_H
11#include "classdesc.h"
12#include <sstream>
13#include <limits>
14#include <cstdlib>
15#include <cstdarg>
16
17namespace classdesc
18{
19
21 {
22 public:
24 virtual double rand() {return double(std::rand())/RAND_MAX;}
25 virtual ~random_init_t() {}
26 };
27
28 typedef random_init_t random_init_onbase_t;
29
30 template <class T> void random_init(random_init_t&, const string&, T&);
31 // constant objects cannot be initialised
32 template <class T> void random_initp(random_init_t&, const string&, const T&)
33 {}
34
37 template <class T> void random_init_normalise(T&);
38
39 // basic types
40 template <class T> typename
42 random_initp(random_init_t& r, const string&, T& a, dummy<0> dum=0)
43 {
44 a=T(std::numeric_limits<T>::max()*r.rand());
45 }
46
47 inline void random_initp(random_init_t& r, const string&, char& a)
48 {
49 a=char((127-32)*r.rand()+32); // truncate to printable ascii characters
50 }
51
52 inline void random_initp(random_init_t& r, const string&, wchar_t& a)
53 {
54 a=wchar_t((127-32)*r.rand()+32); // truncate to ascii characters
55 }
56
57 // floating point types need to be truncated to account for rounding
58 // in ASCII serialisations
59 template <class T> typename
61 random_initp(random_init_t& r, const string&, T& a, dummy<0> dum=0)
62 {
63 std::ostringstream o;
64 o<<T(std::numeric_limits<T>::max()*r.rand());
65 std::istringstream is(o.str());
66 is>>a;
67 }
68
69 template <> inline
70 void random_init(random_init_t& r, const string&, bool& a)
71 {
72 a=r.rand()>=0.5;
73 }
74
75 // strings
76 template <class T>
77 void random_init(random_init_t& r, const string& d, std::basic_string<T>& a)
78 {
79 // randomly fill up to 10 elements
80 a.resize(10*r.rand());
81 for (size_t i=0; i<a.size(); ++i)
82 random_init(r,d,a[i]);
83 }
84
85 // array handling
86 template <class T>
87 void random_init(random_init_t& r, const string& d, is_array ia, const T& a,
88 int ndims,size_t ncopies,...)
89 {
90 std::va_list ap;
91 va_start(ap,ncopies);
92 size_t cnt=ncopies;
93 for (int i=ndims-2; i>=0; --i) cnt*=va_arg(ap,size_t);
94 va_end(ap);
95 for (size_t i=0; i<cnt; ++i)
96 random_init(r,d,(&a)[i]);
97 }
98
99
103
104 template <class T> void random_init(random_init_t& r, const string& d,
105 Enum_handle<T> arg)
106 {
107 // randomly select from the range of valid enum values.
108 int idx=int(enum_keys<T>().size()*r.rand());
109 arg=enum_keysData<T>().keysData[idx].value;
110 }
111
112
114 template <class T> typename
115 enable_if<is_sequence<T>, void>::T
116 random_initp(random_init_t& r, const string& d, T& a, dummy<1> dum=0)
117 {
118 // randomly fill up to 10 elements
119 resize(a, 10*r.rand());
120 for (typename T::iterator i=a.begin(); i!=a.end(); ++i)
121 random_init(r,d,*i);
122 }
123
124 template <class T1, class T2>
125 void random_init(random_init_t& r, const string& d, std::pair<T1,T2>& a)
126 {
127 random_init(r,d+".first",a.first);
128 random_init(r,d+".second",a.second);
129 }
130
131 template <class T> typename
133 random_initp(random_init_t& r, const string& d, T& a, dummy<1> dum=0)
134 {
135 int numElem=int(10*r.rand());
136 for (int i=0; i<numElem; ++i)
137 {
138 typename T::value_type v;
139 random_init(r,d,v);
140 a.insert(v);
141 }
142 }
143
144 // regular pointers
145 template <class T> void random_initp(random_init_t&, const string&, T*) {}
146
147 // Exclude
148 template <class T>
149 void random_init(random_init_t& targ, const string& desc, Exclude<T>& arg) {}
150
151 template <class T>
152 void random_init_onbase(random_init_t& targ, const string& desc, T& arg)
153 {random_init(targ,desc,arg);}
154
155 template <class T>
156 void//typename enable_if<Not<is_pointer<T> >,void>::T
157 random_init(random_init_t&,const string&,is_const_static,T) {}
158
159}
160
161namespace classdesc_access
162{
163 template <class T> struct access_random_init;
164}
165
166#include "use_mbr_pointers.h"
167CLASSDESC_USE_OLDSTYLE_MEMBER_OBJECTS(random_init)
168CLASSDESC_USE_OLDSTYLE_MEMBER_OBJECTS(random_init_onbase)
169CLASSDESC_FUNCTION_NOP(random_init)
170CLASSDESC_FUNCTION_NOP(random_init_onbase)
171
172using classdesc::random_init;
173using classdesc::random_init_onbase;
174
175#endif
Definition classdesc.h:868
Definition classdesc.h:920
Definition classdesc.h:923
Definition random_init_base.h:21
virtual double rand()
return a uniform random number in [0..1)
Definition random_init_base.h:24
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
std::string idx(const std::string &prefix, size_t i)
utility for generating index keys (for use with arrays)
Definition xml_common.h:14
Definition classdesc.h:1012
Definition classdesc.h:405
Definition classdesc.h:299
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Definition classdesc_access.h:27