32#ifndef RDKIT_RDVALUE_H
33#define RDKIT_RDVALUE_H
47 if (rdvalue_is<std::string>(v)) {
48 return *v.
ptrCast<std::string>();
50 throw boost::bad_any_cast();
55 if (rdvalue_is<std::string>(v)) {
56 return *v.
ptrCast<std::string>();
58 throw boost::bad_any_cast();
63inline std::vector<double> rdvalue_cast<std::vector<double>>(
RDValue_cast_t v) {
65 return *v.ptrCast<std::vector<double>>();
67 throw boost::bad_any_cast();
71inline std::vector<double> &rdvalue_cast<std::vector<double> &>(
74 return *v.ptrCast<std::vector<double>>();
76 throw boost::bad_any_cast();
80inline std::vector<float> rdvalue_cast<std::vector<float>>(
RDValue_cast_t v) {
82 return *v.ptrCast<std::vector<float>>();
84 throw boost::bad_any_cast();
88inline std::vector<float> &rdvalue_cast<std::vector<float> &>(
91 return *v.ptrCast<std::vector<float>>();
93 throw boost::bad_any_cast();
97inline std::vector<std::string> rdvalue_cast<std::vector<std::string>>(
100 return *v.ptrCast<std::vector<std::string>>();
102 throw boost::bad_any_cast();
106inline std::vector<std::string> &rdvalue_cast<std::vector<std::string> &>(
108 if (
rdvalue_is<std::vector<std::string>>(v)) {
109 return *v.ptrCast<std::vector<std::string>>();
111 throw boost::bad_any_cast();
115inline std::vector<int> rdvalue_cast<std::vector<int>>(
RDValue_cast_t v) {
117 return *v.ptrCast<std::vector<int>>();
119 throw boost::bad_any_cast();
123inline std::vector<int> &rdvalue_cast<std::vector<int> &>(
RDValue_cast_t v) {
125 return *v.ptrCast<std::vector<int>>();
127 throw boost::bad_any_cast();
131inline std::vector<unsigned int> rdvalue_cast<std::vector<unsigned int>>(
133 if (
rdvalue_is<std::vector<unsigned int>>(v)) {
134 return *v.ptrCast<std::vector<unsigned int>>();
136 throw boost::bad_any_cast();
140inline std::vector<unsigned int> &rdvalue_cast<std::vector<unsigned int> &>(
142 if (
rdvalue_is<std::vector<unsigned int>>(v)) {
143 return *v.ptrCast<std::vector<unsigned int>>();
145 throw boost::bad_any_cast();
151 if (rdvalue_is<boost::any>(v)) {
152 return *v.
ptrCast<boost::any>();
154 throw boost::bad_any_cast();
159 if (rdvalue_is<boost::any>(v)) {
160 return *v.
ptrCast<boost::any>();
162 throw boost::bad_any_cast();
167 if (rdvalue_is<boost::any>(v)) {
168 return *v.
ptrCast<boost::any>();
170 throw boost::bad_any_cast();
177 const std::vector<T> &tv = rdvalue_cast<std::vector<T> &>(val);
178 std::ostringstream sstr;
179 sstr.imbue(std::locale(
"C"));
180 sstr << std::setprecision(17);
182 std::copy(tv.begin(), tv.end(), std::ostream_iterator<T>(sstr,
","));
190 res = rdvalue_cast<std::string>(val);
203#ifdef RDVALUE_HASBOOL
215 res = vectToString<double>(val);
220 res = vectToString<float>(val);
224 res = vectToString<int>(val);
227 res = vectToString<unsigned int>(val);
230 res = vectToString<std::string>(val);
235 res = boost::any_cast<std::string>(rdvalue_cast<boost::any &>(val));
236 }
catch (
const boost::bad_any_cast &) {
237 if (rdvalue_cast<boost::any &>(val).type() ==
typeid(
long)) {
238 res = boost::lexical_cast<std::string>(
239 boost::any_cast<long>(rdvalue_cast<boost::any &>(val)));
240 }
else if (rdvalue_cast<boost::any &>(val).type() ==
241 typeid(
unsigned long)) {
242 res = boost::lexical_cast<std::string>(
243 boost::any_cast<unsigned long>(rdvalue_cast<boost::any &>(val)));
259typename boost::enable_if<boost::is_arithmetic<T>, T>::type
from_rdvalue(
265 res = rdvalue_cast<T>(arg);
266 }
catch (
const boost::bad_any_cast &exc) {
268 res = boost::lexical_cast<T>(rdvalue_cast<std::string>(arg));
274 res = rdvalue_cast<T>(arg);
280typename boost::disable_if<boost::is_arithmetic<T>, T>::type
from_rdvalue(
282 return rdvalue_cast<T>(arg);
static const boost::uint64_t UnsignedIntTag
static const boost::uint64_t StringTag
static const boost::uint64_t VecStringTag
static const boost::uint64_t VecIntTag
static const boost::uint64_t FloatTag
static const boost::uint64_t VecUnsignedIntTag
static const boost::uint64_t DoubleTag
static const boost::uint64_t IntTag
static const boost::uint64_t AnyTag
static const boost::uint64_t VecFloatTag
static const boost::uint64_t VecDoubleTag
static const boost::uint64_t BoolTag
int rdvalue_cast< int >(RDValue_cast_t v)
unsigned int rdvalue_cast< unsigned int >(RDValue_cast_t v)
bool rdvalue_is(const RDValue_cast_t)
std::string vectToString(RDValue val)
double rdvalue_cast< double >(RDValue_cast_t v)
bool rdvalue_tostring(RDValue_cast_t val, std::string &res)
bool rdvalue_cast< bool >(RDValue_cast_t v)
float rdvalue_cast< float >(RDValue_cast_t v)
boost::enable_if< boost::is_arithmetic< T >, T >::type from_rdvalue(RDValue_cast_t arg)
boost::uint64_t getTag() const