9 #ifndef RANDOM_INIT_BASE_H
10 #define RANDOM_INIT_BASE_H
11 #include "classdesc.h"
24 virtual double rand() {
return double(std::rand())/RAND_MAX;}
28 template <
class T>
void random_init(random_init_t&,
const string&, T&);
30 template <
class T>
void random_initp(random_init_t&,
const string&,
const T&)
38 template <
class T>
typename
39 enable_if<And<is_arithmetic<T>,Not<is_floating_point<T> > >,
void>::T
40 random_initp(random_init_t& r,
const string&, T& a, dummy<0> dum=0)
42 a=T(std::numeric_limits<T>::max()*r.rand());
47 template <
class T>
typename
48 enable_if<is_floating_point<T>,
void>::T
49 random_initp(random_init_t& r,
const string&, T& a, dummy<0> dum=0)
52 o<<T(std::numeric_limits<T>::max()*r.rand());
53 std::istringstream is(o.str());
58 void random_init(random_init_t& r,
const string&,
bool& a)
65 void random_init(random_init_t& r,
const string& d, std::basic_string<T>& a)
68 a.resize(10*r.rand());
69 for (
size_t i=0; i<a.size(); ++i)
70 random_init(r,d,a[i]);
75 void random_init(random_init_t& r,
const string& d, is_array ia,
const T& a,
76 int ndims,
size_t ncopies,...)
81 for (
int i=ndims-2; i>=0; --i) cnt*=va_arg(ap,
size_t);
83 for (
size_t i=0; i<cnt; ++i)
84 random_init(r,d,(&a)[i]);
96 int idx=int(enum_keys<T>().size()*r.
rand());
97 arg=enum_keysData<T>().keysData[idx].value;
102 template <
class T>
typename
103 enable_if<is_sequence<T>,
void>::T
107 a.resize(10*r.
rand());
108 for (
typename T::iterator i=a.begin(); i!=a.end(); ++i)
112 template <
class T1,
class T2>
113 void random_init(random_init_t& r,
const string& d, std::pair<T1,T2>& a)
115 random_init(r,d+
".first",a.first);
116 random_init(r,d+
".second",a.second);
119 template <
class T>
typename
120 enable_if<is_associative_container<T>,
void>::T
121 random_initp(random_init_t& r,
const string& d, T& a, dummy<1> dum=0)
123 int numElem=int(10*r.rand());
124 for (
int i=0; i<numElem; ++i)
126 typename T::value_type v;
133 template <
class T>
void random_initp(random_init_t&,
const string&, T*) {}
138 template <
class C,
class T>
139 void random_init(random_init_t&,
const string&, C&, T) {}
145 void random_init(random_init_t&,
const string&, is_const_static, T) {}
148 template <
class T,
class U>
149 void random_init(random_init_t&,
const string&, is_const_static,
const T&, U) {}
153 void random_init(random_init_t& targ,
const string& desc, Exclude<T>& arg) {}
156 void random_init_onbase(random_init_t& targ,
const string& desc, T& arg)
157 {random_init(targ,desc,arg);}
162 namespace classdesc_access
164 template <
class T>
struct access_random_init;
167 using classdesc::random_init;
168 using classdesc::random_init_onbase;
Definition: random_init_base.h:20
virtual double rand()
return a uniform random number in [0..1)
Definition: random_init_base.h:24
Definition: classdesc.h:572
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:291
void random_init_normalise(T &)
Definition: random_init_epilogue.h:123