32#ifndef RDKIT_RDVALUE_PTRMAGIC_H
33#define RDKIT_RDVALUE_PTRMAGIC_H
45#include <boost/utility.hpp>
46#include <boost/lexical_cast.hpp>
51#define RDVALUE_HASBOOL
92static const std::uint64_t
NaN = 0xfff7FFFFFFFFFFFF;
93static const std::uint64_t
MaxDouble = 0xfff8000000000000;
94static const std::uint64_t
DoubleTag = 0xfff8000000000000;
95static const std::uint64_t
FloatTag = 0xfff9000000000000;
96static const std::uint64_t
IntTag = 0xfffa000000000000;
98static const std::uint64_t
BoolTag = 0xfffc000000000000;
101static const std::uint64_t
PtrTag = 0xffff000000000000;
102static const std::uint64_t
StringTag = 0xffff000000000001;
105static const std::uint64_t
VecIntTag = 0xffff000000000004;
108static const std::uint64_t
AnyTag = 0xffff000000000007;
167 static const std::uint64_t
TagMask = 0xFFFF000000000000;
169 static const std::uint64_t
ApplyMask = 0x0000FFFFFFFFFFFF;
180 if (std::isnan(number)) {
192 memcpy(((
char *)&
otherBits), &number,
sizeof(
float));
218 std::any *pointer =
new std::any(any);
227 std::any *pointer =
new std::any(v);
234 std::string *pointer =
new std::string(v);
235 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
241 inline RDValue(
const std::vector<double> &v) {
242 std::vector<double> *pointer =
new std::vector<double>(v);
243 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
250 std::vector<float> *pointer =
new std::vector<float>(v);
251 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
258 std::vector<int> *pointer =
new std::vector<int>(v);
259 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
265 inline RDValue(
const std::vector<unsigned int> &v) {
266 std::vector<unsigned int> *pointer =
new std::vector<unsigned int>(v);
267 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
269 otherBits =
reinterpret_cast<std::uint64_t
>(pointer) |
273 inline RDValue(
const std::vector<std::string> &v) {
274 std::vector<std::string> *pointer =
new std::vector<std::string>(v);
275 assert((
reinterpret_cast<std::uint64_t
>(pointer) &
374 if (v.getTag() == tag)
return true;
378 return v.value.a->type() ==
typeid(T);
422 !((std::is_pointer<T>::value &&
423 (std::is_integral<typename std::remove_pointer<T>::type>::value ||
424 std::is_floating_point<typename std::remove_pointer<T>::type>::value)) ||
425 (std::is_reference<T>::value &&
426 (std::is_integral<typename std::remove_reference<T>::type>::value ||
427 std::is_floating_point<
428 typename std::remove_reference<T>::type>::value))),
429 "rdvalue_cast cannot be used for pointer or reference casts to POD data");
432 return std::any_cast<T>(*v.
ptrCast<std::any>());
434 throw std::bad_any_cast();
441 throw std::bad_any_cast();
448 memcpy(&f, ((
char *)&v.
otherBits),
sizeof(
float));
451 throw std::bad_any_cast();
461 throw std::bad_any_cast();
468 throw std::bad_any_cast();
476 throw std::bad_any_cast();
static const std::uint64_t PtrTag
static const std::uint64_t UnsignedIntTag
static const std::uint64_t StringTag
std::uint64_t GetTag< std::any >()
std::uint64_t GetTag< bool >()
static const std::uint64_t VecStringTag
static const std::uint64_t NaN
static const std::uint64_t VecIntTag
static const std::uint64_t FloatTag
std::uint64_t GetTag< std::string >()
static const std::uint64_t VecUnsignedIntTag
static const std::uint64_t DoubleTag
static const std::uint64_t MaxDouble
static const std::uint64_t IntTag
std::uint64_t GetTag< int >()
std::uint64_t GetTag< float >()
std::uint64_t GetTag< unsigned int >()
static const std::uint64_t AnyTag
std::uint64_t GetTag< double >()
static const std::uint64_t VecFloatTag
static const std::uint64_t VecDoubleTag
static const std::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)
bool rdvalue_is< const double & >(const RDValue_cast_t)
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)
static const std::uint64_t ApplyPtrMask
RDValue(const std::vector< int > &v)
RDValue(const std::vector< std::string > &v)
RDValue(const std::vector< double > &v)
RDValue(const std::vector< unsigned int > &v)
std::uint64_t getTag() const
RDValue(const std::any &any)
static const std::uint64_t ApplyMask
RDValue(const std::string &v)
RDValue(unsigned int number)
RDValue(const std::vector< float > &v)
static const std::uint64_t TagMask
static void cleanup_rdvalue(RDValue v)
static const std::uint64_t PointerTagMask
RDValue(std::any *pointer)