22#include "rxdock/Coord.h"
27const std::string _TRUE(
"TRUE");
28const std::string _FALSE(
"FALSE");
35 Variant(
int i) { SetDouble(i); }
36 Variant(
double d) { SetDouble(d); }
37 Variant(
const std::string &s) { SetString(s); }
38 Variant(
const char *c) { SetString(std::string(c)); }
39 Variant(
const std::vector<std::string> &sl) { SetStringList(sl); }
44 Variant(
const std::vector<double> &dl,
int maxCols,
int precision) {
45 SetDoubleList(dl, maxCols, precision);
54 friend std::ostream &operator<<(std::ostream &s,
const Variant &v) {
58 s <<
"Undefined variant";
60 else if (v.Size() == 1)
65 for (std::vector<std::string>::const_iterator iter = v.m_sl.begin();
66 iter != v.m_sl.end(); iter++)
67 s << *iter << std::endl;
85 Variant &operator=(
const std::string &s) {
89 Variant &operator=(
const char *c) {
90 SetString(std::string(c));
93 Variant &operator=(
const std::vector<std::string> &sl) {
106 void operator+=(
const Variant &v) {
107 std::copy(v.m_sl.begin(), v.m_sl.end(), std::back_inserter(m_sl));
108 m_d = std::atof(GetString().c_str());
112 operator int()
const {
return int(GetDouble()); }
113 operator unsigned int()
const {
return (
unsigned int)(GetDouble()); }
114 operator double()
const {
return GetDouble(); }
115 operator std::string()
const {
return GetString(); }
116 operator std::vector<std::string>()
const {
return GetStringList(); }
117 operator bool()
const {
return GetBool(); }
118 operator Coord()
const {
return GetCoord(); }
120 friend void to_json(json &j,
const Variant &v) {
121 j = json{{
"double", v.m_d}, {
"string-list", v.m_sl}};
124 friend void from_json(
const json &j,
Variant &v) {
125 j.at(
"double").get_to(v.m_d);
126 j.at(
"string-list").get_to(v.m_sl);
134 double GetDouble()
const {
return m_d; }
135 std::string GetString()
const {
136 return m_sl.empty() ? std::string() : m_sl.front();
138 std::vector<std::string> GetStringList()
const {
return m_sl; }
139 bool GetBool()
const {
140 return m_d != 0.0 || GetString() == _TRUE || GetString() ==
"true";
142 Coord GetCoord()
const {
147 std::istringstream(m_sl.front()) >> c;
152 unsigned int Size()
const {
return m_sl.size(); }
153 bool isEmpty()
const {
return m_sl.empty(); }
164 void SetDouble(
double d) {
167 std::ostringstream ostr;
172 std::string s(ostr.str());
177 void SetString(
const std::string &s) {
181 m_d = std::atof(GetString().c_str());
184 void SetStringList(
const std::vector<std::string> &sl) {
186 m_d = std::atof(GetString().c_str());
189 void SetBool(
bool b) {
197 void SetCoord(
const Coord &c) {
200 std::ostringstream ostr;
205 std::string s(ostr.str());
210 void SetDoubleList(
const std::vector<double> &dl,
int maxColumns,
212 int nValues = dl.size();
213 m_d = (nValues > 0) ? dl[0] : 0.0;
215 std::ostringstream ostr;
216 ostr.precision(precision);
217 ostr.setf(std::ios_base::fixed, std::ios_base::floatfield);
218 int lastIndex = nValues - 1;
219 for (
int i = 0; i < nValues; ++i) {
221 if ((ostr.tellp() >= maxColumns) || (i == lastIndex)) {
222 m_sl.push_back(ostr.str());
240 std::vector<std::string> m_sl;
245typedef std::vector<Variant> VariantList;
246typedef VariantList::iterator VariantListIter;
247typedef VariantList::const_iterator VariantListConstIter;
250typedef std::map<std::string, Variant> StringVariantMap;
251typedef StringVariantMap::iterator StringVariantMapIter;
252typedef StringVariantMap::const_iterator StringVariantMapConstIter;