97 void link(
void *p,
const std::type_info &t){
121 Type::call<drain::Type::typeSetter>(*
this, t);
148 bool typeIsSet()
const {
return type != &
typeid(void); };
158 void put(
void *p,
const T & x)
const {
160 std::stringstream sstr;
166 throw std::runtime_error(std::string(
"Caster::put(void *, const T & ), type unset"));
173 void put(
const T & x)
const {
184 void put(
void *p,
const char * x)
const;
188 void put(
const char * x)
const {
195 T
get(
const void *p)
const {
196 throw std::runtime_error(std::string(
"Caster::get() unimplemented output type: ") +
typeid(T).name());
203 return get<T>(this->
ptr);
211 (*translatePtr)(c, ptrC,
ptr);
219 (*translatePtr)(c, c.
ptr, this->
ptr);
225 bool compare(
const void *
ptr,
const Caster &c,
const void *cPtr)
const {
226 return (*comparePtr)(
ptr, c, cPtr);
231 std::istream & fromStream(std::istream & istr,
const void *p)
const{
232 return (*fromStreamPtr)(istr, p);
237 std::ostream &
toOStream(std::ostream &ostr,
const void *p)
const {
261 void (* putBool)(
void *p,
const bool &x);
262 void (* putInt)(
void *p,
const int &x);
263 void (* putChar)(
void *p,
const char &x);
264 void (* putUChar)(
void *p,
const unsigned char &x);
265 void (* putUInt)(
void *p,
const unsigned int &x);
266 void (* putShort)(
void *p,
const short &x);
267 void (* putUShort)(
void *p,
const unsigned short &x);
268 void (* putLong)(
void *p,
const long &x);
269 void (* putULong)(
void *p,
const unsigned long &x);
270 void (* putFloat)(
void *p,
const float &x);
271 void (* putDouble)(
void *p,
const double &x);
274 char (* getChar)(
const void *p);
275 unsigned char (* getUChar)(
const void *p);
276 int (* getInt)(
const void *p);
277 unsigned int (* getUInt)(
const void *p);
278 short (* getShort)(
const void *p);
279 unsigned short (* getUShort)(
const void *p);
280 long (* getLong)(
const void *p);
281 unsigned long (* getULong)(
const void *p);
282 float (* getFloat)(
const void *p);
283 double (* getDouble)(
const void *p);
285 bool (* getBool)(
const void *p);
294 bool (* comparePtr)(
const void *,
const Caster &c,
const void *) =
nullptr;
298 std::ostream & (* toOStreamPtr)(std::ostream &ostr,
const void *p);
299 std::istream & (* fromStreamPtr)(std::istream &istr,
const void *p) =
nullptr;
306 template <
class T,
class F>
308 void putT(
void *p,
const T &x) {
309 *(F*)p =
static_cast<F
>(x);
328 std::stringstream sstr;
330 *(std::string*)p = sstr.str();
337 void putToCasterT(
void *p,
const T &x) {
353 template <
class T,
class F>
356 return static_cast<T
>(*(F*)p);
384 std::stringstream sstr;
385 sstr << *(
const std::string *)p;
410 *(F *)
ptr = c.
get<F>(ptrC);
427 return (*(F *)
ptr == c.
get<F>(cPtr));
435 std::ostream &
toOStreamT(std::ostream & ostr,
const void *p) {
443 std::ostream & toOStreamFloats(std::ostream & ostr,
const void *p){
446 throw std::runtime_error(
"Caster::toOStreamT<double>:: null ptr as argument");
497void Caster::link(
Caster &c){
503void Caster::updateType<void>();
506void Caster::updateType<std::string>();
510void Caster::updateType<Caster>();
516 if (!std::is_fundamental<F>::value){
517 throw std::runtime_error(std::string(__FILE__) + __FUNCTION__ +
':' +
typeid(F).name() +
": cannot convert to basic types");
526 putBool = & Caster::putT<bool,F>;
527 putInt = & Caster::putT<int,F>;
528 putChar = & Caster::putT<char,F>;
529 putUChar = & Caster::putT<unsigned char,F>;
530 putUInt = & Caster::putT<unsigned int,F>;
531 putShort = & Caster::putT<short,F>;
532 putUShort = & Caster::putT<unsigned short,F>;
533 putLong = & Caster::putT<long int,F>;
534 putULong = & Caster::putT<unsigned long,F>;
535 putFloat = & Caster::putT<float,F>;
536 putDouble = & Caster::putT<double,F>;
538 getBool = & Caster::getT<bool,F>;
539 getInt = & Caster::getT<int,F>;
540 getChar = & Caster::getT<char,F>;
541 getUChar = & Caster::getT<unsigned char,F>;
542 getUInt = & Caster::getT<unsigned int,F>;
543 getShort = & Caster::getT<short,F>;
544 getUShort = & Caster::getT<unsigned short,F>;
545 getLong = & Caster::getT<long,F>;
546 getULong = & Caster::getT<unsigned long,F>;
547 getFloat = & Caster::getT<float,F>;
548 getDouble = & Caster::getT<double,F>;
551 comparePtr = & Caster::compareT<F>;
554 fromStreamPtr = & Caster::fromStreamT<F>;
561void Caster::put<bool>(
void *p,
const bool & x)
const {
563 (this->putBool)(p,x);
568void Caster::put<char>(
void *p,
const char & x)
const {
569 (this->putChar)(p,x);
574void Caster::put<unsigned char>(
void *p,
const unsigned char & x)
const {
575 (this->putUChar)(p,x);
579void Caster::put<int>(
void *p,
const int & x)
const {
585void Caster::put<unsigned int>(
void *p,
const unsigned int & x)
const {
586 (this->putUInt)(p,x);
590void Caster::put<long>(
void *p,
const long & x)
const {
591 (this->putLong)(p,x);
595void Caster::put<unsigned long>(
void *p,
const unsigned long & x)
const {
596 (this->putULong)(p,x);
600void Caster::put<float>(
void *p,
const float& x)
const {
601 (this->putFloat)(p,x);
605void Caster::put<double>(
void *p,
const double & x)
const {
606 (this->putDouble)(p,x);
610void Caster::put<std::string>(
void *p,
const std::string & x)
const {
614 if (getType() ==
typeid(std::string))
615 *(std::string *)p = x;
616 else if (getType() ==
typeid(char)){
622 std::cerr <<
"Caster::put<std::string>() warning: single-char dst, assigned 1st of multi-char '"<< x <<
"'\n";
623 *(
char *)p = x.at(0);
639bool Caster::get<bool>(
const void *p)
const {
640 return (this->getBool)(p);
645char Caster::get<char>(
const void *p)
const {
646 return (this->getChar)(p);
650unsigned char Caster::get<unsigned char>(
const void *p)
const {
651 return (this->getUChar)(p);
655short Caster::get<short>(
const void *p)
const {
656 return (this->getShort)(p);
660unsigned short Caster::get<unsigned short>(
const void *p)
const {
661 return (this->getUShort)(p);
665int Caster::get<int>(
const void *p)
const {
666 return (this->getInt)(p);
670unsigned int Caster::get<unsigned int>(
const void *p)
const {
671 return (this->getUInt)(p);
675long Caster::get<long>(
const void *p)
const {
676 return (this->getLong)(p);
680unsigned long Caster::get<unsigned long>(
const void *p)
const {
681 return (this->getULong)(p);
685float Caster::get<float>(
const void *p)
const {
686 return (this->getFloat)(p);
690double Caster::get<double>(
const void *p)
const {
691 return (this->getDouble)(p);
697std::string Caster::get<std::string>(
const void *p)
const {
700 if (getType() ==
typeid(
void)){
701 static const std::string empty;
704 else if (getType() ==
typeid(
char)){
706 return std::string(1, *(
char *)p);
708 else if (getType() ==
typeid(
bool)){
709 return *(
const bool *)p ?
"true" :
"false";
711 else if (getType() ==
typeid(std::string)){
712 return *(
const std::string *)p;
715 std::stringstream sstr;
726void Caster::translateT<void>(
const Caster &c,
const void *ptrC,
void *ptr){
732void Caster::translateT<Caster>(
const Caster &c,
const void *ptrC,
void *ptr){
734 c2.translate(c, ptrC, c2.ptr);
741double Caster::getFromVoidT<double>(
const void *p){
749float Caster::getFromVoidT<float>(
const void *p){
759bool Caster::compareT<void>(
const void *ptr,
const Caster &c,
const void *cPtr){
768std::ostream & Caster::toOStreamT<void>(std::ostream &ostr,
const void *p){
776std::ostream & Caster::toOStreamT<bool>(std::ostream &ostr,
const void *p){
777 ostr << (*(
const bool *)p ?
"true" :
"false");
784std::ostream & Caster::toOStreamT<Caster>(std::ostream &ostr,
const void *p){
793std::ostream & Caster::toOStreamT<float>(std::ostream & ostr,
const void *p){
794 return toOStreamFloats<float>(ostr, p);
800std::ostream & Caster::toOStreamT<double>(std::ostream & ostr,
const void *p){
801 return toOStreamFloats<double>(ostr, p);
std::ostream & toOStream(std::ostream &ostr) const
Write data to output stream.
Definition Caster.h:243
void updateType()
Sets pointers to the type-dependent conversion functions.
Definition Caster.h:514
void put(const T &x) const
Write to internal pointer using put(this->ptr, x).
Definition Caster.h:173
void put(const char *x) const
Write to internal pointer, calls put(this->ptr, x).
Definition Caster.h:188
const std::type_info * type
Current type.
Definition Caster.h:488
std::ostream & toOStream(std::ostream &ostr, const void *p) const
Write data to output stream.
Definition Caster.h:237
static T getFromVoidT(const void *p)
This default implementation is for integral numeric types, returns zero. Specialisation for floats re...
Definition Caster.h:367
static T getT(const void *p)
The main handler converting input to output.
Definition Caster.h:355
T get(const void *p) const
Default implementation throws an error. See specialized implementation below.
Definition Caster.h:195
void unsetType()
calls void setType<void>().
Definition Caster.cpp:135
const std::type_info & getType() const
Returns type_info of the current type.
Definition Caster.h:145
static bool compareT(const void *ptr, const Caster &c, const void *cPtr)
Checks equality through base type casting.
Definition Caster.h:419
static void putToVoidT(void *p, const T &x)
Void - does nothing, regardless of input type.
Definition Caster.h:316
size_t getElementSize() const
Returns the size of the base type (size of an element, not of element array).
Definition Caster.h:152
void setType(const std::type_info &t)
Calls setType<T>() for which typeid(T) = t.
Definition Caster.h:120
Caster()
Default constructor. Leaves the type undefined.
Definition Caster.h:79
virtual bool requestType(const std::type_info &t)
Utility for derived classes, which may be able to adapt memory array type as well.
Definition Caster.h:135
size_t byteSize
Size of target memory (target object) in bytes.
Definition Caster.h:491
void translate(const Caster &c) const
Convert from str Caster.
Definition Caster.h:217
void(* translatePtr)(const Caster &c, const void *ptrC, void *ptr)
Convert from str pointer and Caster.
Definition Caster.h:290
std::ostream &(* toOStreamPtr)(std::ostream &ostr, const void *p)
Write to stream.
Definition Caster.h:298
void setType()
Sets pointers to the type-dependent conversion functions.
Definition Caster.h:129
void translate(const Caster &c, const void *ptrC, void *ptr) const
Convert from str pointer and Caster.
Definition Caster.h:209
static T getFromStringT(const void *p)
The main handler converting input to output.
Definition Caster.h:382
void * ptr
Future member: enables setting Caster type.
Definition Caster.h:248
static std::istream & fromStreamT(std::istream &istr, const void *p)
Output.
Definition Caster.h:479
static std::ostream & toOStreamT(std::ostream &ostr, const void *p)
Output.
Definition Caster.h:435
void put(void *p, const T &x) const
Default conversion (for unconventional types). Uses std::stringstream for conversion.
Definition Caster.h:158
static void putToStringT(void *p, const T &x)
A handler for converting input to a std::string.
Definition Caster.h:327
Caster(const Caster &c)
Copy constructor. Copies the type.
Definition Caster.h:87
static void translateT(const Caster &c, const void *ptrC, void *ptr)
Casts from ptrC to ptr.
Definition Caster.h:408
static void putT(void *p, const T &x)
Convert input of base type to internally applied base type.
Definition Caster.h:308
Definition DataSelector.cpp:1277