32 #ifndef RDKIT_RDVALUE_TAGGED_UNION_H
33 #define RDKIT_RDVALUE_TAGGED_UNION_H
44 #include <boost/any.hpp>
45 #include <boost/utility.hpp>
46 #include <boost/lexical_cast.hpp>
47 #include <boost/type_traits/is_floating_point.hpp>
51 #define RDVALUE_HASBOOL
121 inline short GetTag<std::string>() {
125 inline short GetTag<std::vector<double>>() {
129 inline short GetTag<std::vector<float>>() {
133 inline short GetTag<std::vector<int>>() {
137 inline short GetTag<std::vector<unsigned int>>() {
141 inline short GetTag<std::vector<std::string>>() {
145 inline short GetTag<boost::any>() {
158 std::vector<double> *
vd;
159 std::vector<float> *
vf;
160 std::vector<int> *
vi;
161 std::vector<unsigned int> *
vu;
162 std::vector<std::string> *
vs;
172 inline Value(std::vector<double> *v) :
vd(v) {}
173 inline Value(std::vector<float> *v) :
vf(v) {}
175 inline Value(std::vector<unsigned int> *v) :
vu(v) {}
176 inline Value(std::vector<std::string> *v) :
vs(v) {}
181 return boost::any_cast<T *>(*value.
a);
184 inline boost::any *valuePtrCast<boost::any>(
Value value) {
189 inline std::string *valuePtrCast<std::string>(
Value value) {
193 inline std::vector<double> *valuePtrCast<std::vector<double>>(Value value) {
197 inline std::vector<float> *valuePtrCast<std::vector<float>>(Value value) {
201 inline std::vector<int> *valuePtrCast<std::vector<int>>(Value value) {
205 inline std::vector<unsigned int> *valuePtrCast<std::vector<unsigned int>>(
210 inline std::vector<std::string> *valuePtrCast<std::vector<std::string>>(
247 inline RDValue(
const std::vector<unsigned int> &v)
248 :
value(new std::vector<unsigned int>(v)),
250 inline RDValue(
const std::vector<std::string> &v)
258 return RDTypeTag::detail::valuePtrCast<T>(
value);
306 inline void copy_rdvalue(RDValue &dest,
const RDValue &src) {
311 dest.type = src.type;
314 dest.value.s =
new std::string(*src.value.s);
317 dest.value.a =
new boost::any(*src.value.a);
320 dest.value.vd =
new std::vector<double>(*src.value.vd);
323 dest.value.vf =
new std::vector<float>(*src.value.vf);
326 dest.value.vi =
new std::vector<int>(*src.value.vi);
329 dest.value.vu =
new std::vector<unsigned int>(*src.value.vu);
332 dest.value.vs =
new std::vector<std::string>(*src.value.vs);
339 #ifdef RDK_32BIT_BUILD
352 RDTypeTag::GetTag<typename boost::remove_reference<T>::type>();
358 return v.value.a->type() ==
typeid(T);
361 if (v.getTag() == tag) {
372 const short tag = RDTypeTag::GetTag<boost::any>();
386 BOOST_STATIC_ASSERT(!(
387 (boost::is_pointer<T>::value &&
388 (boost::is_integral<
typename boost::remove_pointer<T>::type>::value ||
389 boost::is_floating_point<
390 typename boost::remove_pointer<T>::type>::value)) ||
391 (boost::is_reference<T>::value &&
392 (boost::is_integral<
typename boost::remove_reference<T>::type>::value ||
393 boost::is_floating_point<
394 typename boost::remove_reference<T>::type>::value))));
396 if (rdvalue_is<boost::any>(v)) {
397 return boost::any_cast<T>(*v.ptrCast<boost::any>());
399 throw boost::bad_any_cast();
408 if (rdvalue_is<float>(v)) {
411 throw boost::bad_any_cast();
416 if (rdvalue_is<float>(v)) {
420 return boost::numeric_cast<float>(v.value.d);
422 throw boost::bad_any_cast();
427 if (rdvalue_is<int>(v)) {
430 if (rdvalue_is<unsigned int>(v)) {
431 return boost::numeric_cast<int>(v.value.u);
433 throw boost::bad_any_cast();
438 if (rdvalue_is<int>(v)) {
439 return boost::numeric_cast<std::int8_t>(v.
value.
i);
441 if (rdvalue_is<unsigned int>(v)) {
442 return boost::numeric_cast<std::int8_t>(v.
value.
u);
444 throw boost::bad_any_cast();
449 if (rdvalue_is<int>(v)) {
450 return boost::numeric_cast<std::int16_t>(v.
value.
i);
452 if (rdvalue_is<unsigned int>(v)) {
453 return boost::numeric_cast<std::int16_t>(v.
value.
u);
455 throw boost::bad_any_cast();
460 if (rdvalue_is<int>(v)) {
461 return static_cast<std::int64_t
>(v.
value.
i);
463 if (rdvalue_is<unsigned int>(v)) {
464 return static_cast<std::int64_t
>(v.
value.
u);
466 if (rdvalue_is<boost::any>(v)) {
467 return boost::any_cast<std::int64_t>(*v.
ptrCast<boost::any>());
469 throw boost::bad_any_cast();
474 if (rdvalue_is<unsigned int>(v)) {
477 if (rdvalue_is<int>(v)) {
478 return boost::numeric_cast<unsigned int>(v.value.i);
480 throw boost::bad_any_cast();
485 if (rdvalue_is<int>(v)) {
486 return boost::numeric_cast<std::uint8_t>(v.
value.
i);
488 if (rdvalue_is<unsigned int>(v)) {
489 return boost::numeric_cast<std::uint8_t>(v.
value.
u);
491 throw boost::bad_any_cast();
496 if (rdvalue_is<int>(v)) {
497 return boost::numeric_cast<std::uint16_t>(v.
value.
i);
499 if (rdvalue_is<unsigned int>(v)) {
500 return boost::numeric_cast<std::uint16_t>(v.
value.
u);
502 throw boost::bad_any_cast();
507 if (rdvalue_is<unsigned int>(v)) {
508 return static_cast<std::uint64_t
>(v.
value.
u);
510 if (rdvalue_is<int>(v)) {
511 return boost::numeric_cast<std::uint64_t>(v.
value.
i);
513 if (rdvalue_is<boost::any>(v)) {
514 return boost::any_cast<std::uint64_t>(*v.
ptrCast<boost::any>());
516 throw boost::bad_any_cast();
521 if (rdvalue_is<bool>(v)) {
524 throw boost::bad_any_cast();
T * valuePtrCast(Value value)
boost::uint64_t GetTag< bool >()
static const boost::uint64_t UnsignedIntTag
static const boost::uint64_t StringTag
boost::uint64_t GetTag< int >()
boost::uint64_t GetTag< float >()
static const boost::uint64_t VecStringTag
static const boost::uint64_t VecIntTag
static const boost::uint64_t FloatTag
boost::uint64_t GetTag< double >()
static const boost::uint64_t VecUnsignedIntTag
static const boost::uint64_t DoubleTag
boost::uint64_t GetTag< unsigned int >()
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)
double rdvalue_cast< double >(RDValue_cast_t v)
void copy_rdvalue(RDValue &dest, const RDValue &src)
T rdvalue_cast(RDValue_cast_t v)
bool rdvalue_is< double >(const RDValue_cast_t)
bool rdvalue_cast< bool >(RDValue_cast_t v)
float rdvalue_cast< float >(RDValue_cast_t v)
RDValue(const std::vector< int > &v)
RDValue(const std::vector< std::string > &v)
RDValue(const boost::any &v)
RDValue(const std::vector< double > &v)
RDValue(const std::vector< unsigned int > &v)
boost::uint64_t getTag() const
RDTypeTag::detail::Value value
RDValue(const std::string &v)
RDValue(const std::vector< float > &v)
static void cleanup_rdvalue(RDValue &rdvalue)
Value(std::vector< std::string > *v)
std::vector< std::string > * vs
Value(std::vector< unsigned int > *v)
Value(std::vector< double > *v)
Value(std::vector< float > *v)
std::vector< unsigned int > * vu
std::vector< float > * vf
std::vector< double > * vd
Value(std::vector< int > *v)