42 enum { NONE = 0, BOOL = 1, INT = 2, DOUBLE = 3, COMPLEX_DOUBLE = 4, STRING = 5 };
52 RData(
const bool v) : type_(BOOL), b_data(v) {}
55 RData(
const int v) : type_(INT) { i_data.push_back(v); }
58 RData(
const double v) : type_(DOUBLE) { d_data.push_back(v); }
61 RData(
const std::complex<double> v) : type_(COMPLEX_DOUBLE) { cd_data.push_back(v); }
63 RData(
const std::string& v) : type_(STRING), s_data(v) {}
65 RData(
const char* v) : type_(STRING), s_data(v) {}
68 template <
typename InputIterator>
69 RData(InputIterator first, InputIterator last) {
70 set_impl<InputIterator, typename std::iterator_traits<InputIterator>::value_type>::f(
76 RData(
const std::vector<T>& v) {
77 set(v.begin(), v.end());
87 void set(
const bool v) {
94 void set(
const int v) {
101 void set(
const double v) {
108 void set(
const std::complex<double> v) {
110 type_ = COMPLEX_DOUBLE;
111 cd_data.push_back(v);
115 void set(
const std::string& data) {
122 void set(
const char* data) {
125 s_data = std::string(data);
129 template <
typename T>
130 void set(
const std::vector<T>& v) {
131 set(v.begin(), v.end());
135 template <
typename InputIterator>
136 void set(InputIterator first, InputIterator last) {
137 set_impl<InputIterator, typename std::iterator_traits<InputIterator>::value_type>::f(
145 const std::vector<int>&
get_int()
const {
return i_data; }
148 const std::vector<double>&
get_double()
const {
return d_data; }
156 template <
typename T>
157 inline const std::vector<T>&
get()
const {
159 return std::vector<T>();
166 int type()
const {
return type_; }
176 return typeid(double);
178 return typeid(std::complex<double>);
180 return typeid(std::string);
195 return i_data.size();
197 return d_data.size();
199 return cd_data.size();
201 return s_data.size();
217 const size_t rdata_mul[6] = {0,
sizeof(bool), 4, 8, 16, 1};
218 const size_t rdata_add[6] = {0, 0, 0, 0, 0, 0};
220 return rdata_mul[
type] * num_elements + rdata_add[
type];
232 return (
const void*)&b_data;
234 return (
const void*)&
get_int()[0];
237 case RData::COMPLEX_DOUBLE:
248 bool operator==(
const bool o)
const {
return (type_ == RData::BOOL && b_data == o); }
252 return (type_ == RData::INT && i_data.size() == 1 && i_data.front() == o);
257 return (type_ == RData::INT && i_data == o);
262 return (type_ == RData::DOUBLE && d_data.size() == 1 && d_data.front() == o);
267 return (type_ == RData::DOUBLE && d_data == o);
273 return (type_ == RData::COMPLEX_DOUBLE && cd_data.size() == 1 && cd_data.front() == o);
278 bool operator==(
const std::vector<std::complex<double> >& o)
const {
279 return (type_ == RData::COMPLEX_DOUBLE && cd_data == o);
284 bool operator==(
const std::string& o)
const {
return (type_ == RData::STRING && s_data == o); }
288 bool operator==(
const char* o)
const {
return (type_ == RData::STRING && s_data == o); }
291 friend std::ostream& operator<<(std::ostream& o,
const RData& v);
293 void print(std::ostream& o = std::cout)
const {
299 o << (b_data ?
"TRUE" :
"FALSE");
302 for (
size_t i = 0; i != i_data.size(); ++i) {
303 o << (i > 0 ?
", " :
"") << i_data[i];
308 o << std::setprecision(15) <<
"[";
309 for (
size_t i = 0; i != d_data.size(); ++i) {
310 o << (i > 0 ?
", " :
"") << d_data[i];
315 o << std::setprecision(15) <<
"[";
316 for (
size_t i = 0; i != cd_data.size(); ++i) {
317 o << (i > 0 ?
", " :
"") << cd_data[i];
322 o <<
'"' << s_data <<
'"';
329 template <
typename T,
typename V>
331 static void f(
RData& r, T first, T last) { r.clear(); }
334 template <
typename T>
335 struct set_impl<T, int> {
336 static void f(
RData& r, T first, T last) {
338 r.type_ = RData::INT;
339 r.i_data.insert(r.i_data.end(), first, last);
343 template <
typename T>
344 struct set_impl<T, double> {
345 static void f(
RData& r, T first, T last) {
347 r.type_ = RData::DOUBLE;
348 r.d_data.insert(r.d_data.end(), first, last);
352 template <
typename T>
353 struct set_impl<T, std::complex<double> > {
354 static void f(
RData& r, T first, T last) {
356 r.type_ = RData::COMPLEX_DOUBLE;
357 r.cd_data.insert(r.cd_data.end(), first, last);
361 template <
typename T>
362 struct set_impl<T,
b2000::csda<double> > {
363 static void f(
RData& r, T first, T last) {
365 r.type_ = RData::COMPLEX_DOUBLE;
366 r.cd_data.insert(r.cd_data.end(), first, last);
370 template <
typename T>
371 struct set_impl<T, char> {
372 static void f(
RData& r, T first, T last) {
374 r.type_ = RData::STRING;
375 r.s_data.insert(r.s_data.end(), first, last);
390 std::vector<int> i_data;
391 std::vector<double> d_data;
392 std::vector<std::complex<double> > cd_data;
396inline std::ostream& operator<<(std::ostream& o,
const RData& v) {
402inline const std::vector<int>& RData::get<int>()
const {
407inline const std::vector<double>& RData::get<double>()
const {
412inline const std::vector<std::complex<double> >& RData::get<std::complex<double> >()
const {
413 return get_complex_double();
417inline const std::vector<b2000::csda<double> >& RData::get<b2000::csda<double> >()
const {
418 return reinterpret_cast<const std::vector<b2000::csda<double>
>&>(get_complex_double());
427class RTable :
public std::map<std::string, RData> {
433 bool has_key(
const std::string& key)
const {
return find(key) != end(); }
437 iterator i = find(key);
438 if (i == end()) {
return; }
444 const_iterator i = find(key);
445 if (i == end()) { key_error(key); }
451 iterator i = find(key);
452 if (i == end()) { key_error(key); }
458 for (
auto const& i : o) { (*this)[i.first] = i.second; }
462 template <
typename T>
463 void set(
const std::string& key,
const T& v,
const bool new_key =
false) {
464 iterator i = find(key);
466 i = insert(std::pair<std::string, RData>(key,
RData(v))).first;
468 if (new_key) { exists_error(key); }
473 void set(
const std::string& key,
const bool v,
const bool new_key =
false) {
474 iterator i = find(key);
476 i = insert(std::pair<std::string, RData>(key,
RData(v))).first;
478 if (new_key) { exists_error(key); }
484 template <
typename T>
485 void set(
const std::string& key,
const std::vector<T>& v,
const bool new_key =
false) {
486 iterator i = find(key);
488 i = insert(std::pair<std::string, RData>(key,
RData(v))).first;
490 if (new_key) { exists_error(key); }
496 template <
typename InputIterator>
498 const std::string& key, InputIterator first, InputIterator last,
499 const bool new_key =
false) {
500 iterator i = find(key);
502 i = insert(std::pair<std::string, RData>(key,
RData(first, last))).first;
504 if (new_key) { exists_error(key); }
505 (*i).second.set(first, last);
510 void set(
const std::string& key,
const std::string& s,
const bool new_key =
false) {
511 iterator i = find(key);
513 i = insert(std::pair<std::string, RData>(key,
RData(s))).first;
515 if (new_key) { exists_error(key); }
523 const_iterator i = find(key);
525 if (i->second.type() == RData::BOOL) {
return i->second.get_bool(); }
526 type_error(key, i->second.type(), RData::BOOL);
535 bool get_bool(
const std::string& key,
const bool default_)
const {
536 const_iterator i = find(key);
538 if (i->second.type() == RData::BOOL) {
return i->second.get_bool(); }
539 type_error(key, i->second.type(), RData::BOOL);
547 const std::vector<int>& vv = get_int_(key);
548 if (vv.empty()) { empty_error(key); }
555 int get_int(
const std::string& key,
const int default_)
const {
556 const_iterator i = find(key);
557 if (i == end()) {
return default_; }
558 const std::vector<int>& vv = (*i).second.get_int();
559 if (vv.empty()) { empty_error(key); }
566 const_iterator i = find(key);
567 if (i == end()) { key_error(key); }
568 const RData& r = (*i).second;
569 if (r.
empty()) { empty_error(key); }
578 double get_double(
const std::string& key,
const double default_)
const {
579 const_iterator i = find(key);
580 if (i == end()) {
return default_; }
581 const RData& r = (*i).second;
582 if (r.
empty()) { empty_error(key); }
591 const_iterator i = find(key);
592 if (i == end()) { key_error(key); }
593 const RData& r = (*i).second;
594 if (r.
empty()) { empty_error(key); }
595 if (r.
type() == RData::DOUBLE) {
return std::complex<double>(r.
get_double().front()); }
596 if (r.
type() != RData::COMPLEX_DOUBLE) { type_error(key, r.
type(), RData::COMPLEX_DOUBLE); }
612 const std::string& key,
const std::complex<double>& default_)
const {
613 const_iterator i = find(key);
614 if (i == end()) {
return default_; }
615 const RData& r = (*i).second;
616 if (r.
empty()) { empty_error(key); }
617 if (r.
type() == RData::DOUBLE) {
return std::complex<double>(r.
get_double().front()); }
618 if (r.
type() != RData::COMPLEX_DOUBLE) { type_error(key, r.
type(), RData::COMPLEX_DOUBLE); }
627 const std::string& key,
const b2000::csda<double>& default_)
const {
633 std::string
get_string(
const std::string& key)
const {
return get_string_(key); }
638 std::string
get_string(
const std::string& key,
const std::string& default_)
const {
639 const_iterator i = find(key);
640 if (i == end()) {
return default_; }
641 return (*i).second.get_string();
646 template <
typename T>
647 inline T
get(
const std::string& key)
const {
655 template <
typename T>
656 inline T
get(
const std::string& key,
const T& default_)
const {
663 void get(
const std::string& key, std::vector<int>& v)
const {
664 const std::vector<int>& vv = get_int_(key);
670 void get(
const std::string& key, std::vector<double>& v)
const {
671 const_iterator i = find(key);
672 if (i == end()) { key_error(key); }
673 const RData& r = (*i).second;
674 if (r.
type() == RData::COMPLEX_DOUBLE) {
677 v.reserve(vc.size());
678 for (
auto j : vc) { v.push_back(j.real()); }
679 }
else if (r.
type() == RData::DOUBLE) {
682 type_error(key, r.
type(), RData::DOUBLE);
689 void get(
const std::string& key, std::vector<std::complex<double> >& v)
const {
690 const_iterator i = find(key);
691 if (i == end()) { key_error(key); }
692 const RData& r = (*i).second;
693 if (r.
type() == RData::DOUBLE) {
694 const std::vector<double>& vd = r.
get_double();
696 v.reserve(vd.size());
697 for (
auto j : vd) { v.push_back(std::complex<double>(j)); }
698 }
else if (r.
type() == RData::COMPLEX_DOUBLE) {
701 type_error(key, r.
type(), RData::COMPLEX_DOUBLE);
708 void get(
const std::string& key, std::vector<b2000::csda<double> >& v)
const {
709 const_iterator i = find(key);
710 if (i == end()) { key_error(key); }
711 const RData& r = (*i).second;
712 if (r.
type() == RData::DOUBLE) {
713 const std::vector<double>& vd = r.
get_double();
715 v.reserve(vd.size());
716 for (
auto j : vd) { v.push_back(std::complex<double>(j)); }
717 }
else if (r.
type() == RData::COMPLEX_DOUBLE) {
720 v.reserve(vc.size());
721 for (
auto j : vc) { v.push_back(std::complex<double>(j)); }
723 type_error(key, r.
type(), RData::COMPLEX_DOUBLE);
730 void get(
const std::string& key,
const size_t size_,
int* v)
const {
731 const std::vector<int>& vv = get_int_(key);
732 if (vv.size() < size_) { size_error(key, vv.size(), size_); }
733 std::copy(&vv[0], &vv[0] + size_, v);
739 void get(
const std::string& key,
const size_t size_,
double* v)
const {
740 const std::vector<double>& vv = get_double_(key);
741 if (vv.size() < size_) { size_error(key, vv.size(), size_); }
742 std::copy(&vv[0], &vv[0] + size_, v);
749 void get(
const std::string& key,
const size_t size_, std::complex<double>* v)
const {
750 const_iterator i = find(key);
751 if (i == end()) { key_error(key); }
752 const RData& r = (*i).second;
753 if (r.
type() == RData::DOUBLE) {
754 const std::vector<double>& vd = r.
get_double();
755 if (vd.size() < size_) { size_error(key, vd.size(), size_); }
756 for (
size_t j = 0; j != vd.size(); ++j) { v[j] = std::complex<double>(vd[j]); }
757 }
else if (r.
type() == RData::COMPLEX_DOUBLE) {
759 if (vc.size() < size_) { size_error(key, vc.size(), size_); }
760 std::copy(&vc[0], &vc[0] + size_, v);
762 type_error(key, r.
type(), RData::COMPLEX_DOUBLE);
787 friend std::ostream& operator<<(std::ostream& o,
const RTable& r);
789 void print(std::ostream& o)
const {
791 for (const_iterator i = begin(); i != end(); ++i) {
792 o << (i != begin() ?
", " :
"") <<
'"' << (*i).first <<
"\":" << (*i).second;
797 const std::vector<int>& get_int_(
const std::string& key)
const {
798 const_iterator i = find(key);
799 if (i == end()) { key_error(key); }
800 const RData& r = (*i).second;
801 if (r.type() != RData::INT) { type_error(key, r.type(), RData::INT); }
805 const std::vector<double>& get_double_(
const std::string& key)
const {
806 const_iterator i = find(key);
807 if (i == end()) { key_error(key); }
808 const RData& r = (*i).second;
809 if (r.type() != RData::DOUBLE) { type_error(key, r.type(), RData::DOUBLE); }
810 return r.get_double();
813 std::complex<double> get_complex_double_first_(
const std::string& key)
const {
814 const_iterator i = find(key);
815 if (i == end()) { key_error(key); }
816 const RData& r = (*i).second;
817 if (r.empty()) { empty_error(key); }
818 if (r.type() == RData::DOUBLE) {
return std::complex<double>(r.get_double().front()); }
819 if (r.type() != RData::COMPLEX_DOUBLE) { type_error(key, r.type(), RData::COMPLEX_DOUBLE); }
820 return r.get_complex_double().front();
823 const std::string& get_string_(
const std::string& key)
const {
824 const_iterator i = find(key);
825 if (i == end()) { key_error(key); }
826 const RData& r = (*i).second;
827 if (r.type() != RData::STRING) { type_error(key, r.type(), RData::STRING); }
828 return r.get_string();
831 void key_error(
const std::string& key)
const;
833 void exists_error(
const std::string& key)
const;
835 void type_error(
const std::string& key,
const int has,
const int need)
const;
837 void empty_error(
const std::string& key)
const;
839 void size_error(
const std::string& key,
const size_t has,
const size_t need)
const;
842inline std::ostream& operator<<(std::ostream& o,
const RTable& r) {
848inline std::string RTable::get<std::string>(
const std::string& key)
const {
849 return get_string(key);
853inline bool RTable::get<bool>(
const std::string& key)
const {
858inline int RTable::get<int>(
const std::string& key)
const {
863inline double RTable::get<double>(
const std::string& key)
const {
868inline std::complex<double> RTable::get<std::complex<double> >(
const std::string& key)
const {
869 return get_complex_double(key);
873inline b2000::csda<double> RTable::get<b2000::csda<double> >(
const std::string& key)
const {
874 return get_complex_double(key);
878inline std::string RTable::get<std::string>(
879 const std::string& key,
const std::string& default_)
const {
880 return get_string(key, default_);
884inline bool RTable::get<bool>(
const std::string& key,
const bool& default_)
const {
889inline int RTable::get<int>(
const std::string& key,
const int& default_)
const {
894inline double RTable::get<double>(
const std::string& key,
const double& default_)
const {
899inline std::complex<double> RTable::get<std::complex<double> >(
900 const std::string& key,
const std::complex<double>& default_)
const {
901 return get_complex_double(key, default_);
905inline b2000::csda<double> RTable::get<b2000::csda<double> >(
906 const std::string& key,
const b2000::csda<double>& default_)
const {
907 return get_complex_double(key, default_);
#define THROW
Definition b2exception.H:198
bool operator==(const bool o) const
Comparison with a bool. The data type must be of type BOOL.
Definition b2rtable.H:248
bool operator==(const char *o) const
Definition b2rtable.H:288
const std::type_info & type_info() const
Return the typeid() of the data type.
Definition b2rtable.H:169
const std::vector< std::complex< double > > & get_complex_double() const
Definition b2rtable.H:152
void set(InputIterator first, InputIterator last)
Copy a range.
Definition b2rtable.H:136
static size_t get_data_size(const int type, const size_t num_elements)
Definition b2rtable.H:215
void set(const std::vector< T > &v)
Copy a vector.
Definition b2rtable.H:130
bool operator==(const std::vector< double > &o) const
Comparison with a vector of double. The data type must be of type DOUBLE.
Definition b2rtable.H:266
void set(const bool v)
Assign a single bool value.
Definition b2rtable.H:87
int type() const
Definition b2rtable.H:166
RData()
Create an RData instance of type NONE.
Definition b2rtable.H:49
void set(const std::string &data)
Assign a string.
Definition b2rtable.H:115
RData(const double v)
Create an RData instance by assigning a single element.
Definition b2rtable.H:58
const std::vector< double > & get_double() const
Definition b2rtable.H:148
const std::vector< T > & get() const
Definition b2rtable.H:157
const std::string & get_string() const
Definition b2rtable.H:163
bool operator==(const std::vector< int > &o) const
Comparison with a vector of int. The data type must be of type INT.
Definition b2rtable.H:256
bool operator==(const int &o) const
Comparison with an int. The data type must be of type INT.
Definition b2rtable.H:251
bool operator==(const std::complex< double > &o) const
Definition b2rtable.H:272
bool empty() const
true if the number of elements is 0.
Definition b2rtable.H:208
void set(const std::complex< double > v)
Assign a single complex-double value.
Definition b2rtable.H:108
RData(const bool v)
Create an RData instance by assigning a single element.
Definition b2rtable.H:52
RData(InputIterator first, InputIterator last)
Create an RData instance by copying a range.
Definition b2rtable.H:69
void set(const double v)
Assign a single double value.
Definition b2rtable.H:101
bool get_bool() const
Definition b2rtable.H:142
RData(const std::vector< T > &v)
Create an RData instance by copying a vector.
Definition b2rtable.H:76
bool operator==(const std::string &o) const
Definition b2rtable.H:284
size_t get_data_size() const
Definition b2rtable.H:225
bool operator==(const std::vector< std::complex< double > > &o) const
Definition b2rtable.H:278
RData(const int v)
Create an RData instance by assigning a single element.
Definition b2rtable.H:55
const std::vector< int > & get_int() const
Definition b2rtable.H:145
RData(const std::complex< double > v)
Create an RData instance by assigning a single element.
Definition b2rtable.H:61
void set(const char *data)
Assign a 0-terminated array of characters.
Definition b2rtable.H:122
void set(const int v)
Assign a single integer value.
Definition b2rtable.H:94
size_t size() const
Definition b2rtable.H:188
static const char * type_to_string[6]
Definition b2rtable.H:46
bool operator==(const double &o) const
Comparison with a double. The data type must be of type DOUBLE.
Definition b2rtable.H:261
void set()
Assign NONE.
Definition b2rtable.H:81
const void * get_data() const
Definition b2rtable.H:229
Definition b2rtable.H:427
void set(const std::string &key, const std::vector< T > &v, const bool new_key=false)
Copy a vector. If new_key is true, the key must not exist.
Definition b2rtable.H:485
bool has_key(const std::string &key) const
Definition b2rtable.H:433
std::complex< double > get_complex_double(const std::string &key) const
Definition b2rtable.H:590
void get(const std::string &key, const size_t size_, std::complex< double > *v) const
Definition b2rtable.H:749
void update(const RTable &o)
Update with all (key,value) pairs from another RTable.
Definition b2rtable.H:457
void get(const std::string &key, std::vector< std::complex< double > > &v) const
Definition b2rtable.H:689
int get_int(const std::string &key, const int default_) const
Definition b2rtable.H:555
void get(const std::string &key, std::vector< double > &v) const
Definition b2rtable.H:670
void get(const std::string &key, const size_t size_, int *v) const
Definition b2rtable.H:730
bool get_bool(const std::string &key, const bool default_) const
Definition b2rtable.H:535
const RData & operator()(const std::string &key) const
Definition b2rtable.H:443
void get(const std::string &key, std::vector< int > &v) const
Definition b2rtable.H:663
void set(const std::string &key, InputIterator first, InputIterator last, const bool new_key=false)
Copy a range. If new_key is true, the key must not exist.
Definition b2rtable.H:497
T get(const std::string &key) const
Definition b2rtable.H:647
void get(const std::string &key, std::vector< b2000::csda< double > > &v) const
Definition b2rtable.H:708
std::string get_string(const std::string &key) const
Definition b2rtable.H:633
void remove_key(const std::string &key)
Remove entry "key".
Definition b2rtable.H:436
const char * update_from_array(const char *abegin, const char *aend)
Definition b2rtable.C:123
T get(const std::string &key, const T &default_) const
Definition b2rtable.H:656
b2000::csda< double > get_csda_double(const std::string &key) const
Definition b2rtable.H:603
b2000::csda< double > get_csda_double(const std::string &key, const b2000::csda< double > &default_) const
Definition b2rtable.H:626
bool get_bool(const std::string &key) const
Definition b2rtable.H:522
void append_to_array(std::vector< char > &a) const
Definition b2rtable.C:49
std::complex< double > get_complex_double(const std::string &key, const std::complex< double > &default_) const
Definition b2rtable.H:611
void set(const std::string &key, const T &v, const bool new_key=false)
Assign a single value. If new_key is true, the key must not exist.
Definition b2rtable.H:463
std::string get_string(const std::string &key, const std::string &default_) const
Definition b2rtable.H:638
std::string errmsg_context
Will be pre-pended to error messages.
Definition b2rtable.H:430
double get_double(const std::string &key, const double default_) const
Definition b2rtable.H:578
int get_int(const std::string &key) const
Definition b2rtable.H:546
RData & operator()(const std::string &key)
Definition b2rtable.H:450
void get(const std::string &key, const size_t size_, double *v) const
Definition b2rtable.H:739
double get_double(const std::string &key) const
Definition b2rtable.H:565
void set(const std::string &key, const std::string &s, const bool new_key=false)
Copy a string. If new_key is true, the key must not exist.
Definition b2rtable.H:510
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
GenericException< UnimplementedError_name > UnimplementedError
Definition b2exception.H:314