anyscalar.h: add ctor from type code and void*

also helper bufferUnsafe() to get storage pointer
or c_str().
This commit is contained in:
Michael Davidsaver
2018-04-08 15:14:19 -07:00
parent 8093c25b72
commit e973422ee1
2 changed files with 41 additions and 1 deletions
+22
View File
@@ -112,6 +112,18 @@ public:
_stype = (ScalarType)ScalarTypeID<TT>::value;
}
AnyScalar(ScalarType type, const void *buf)
{
if(type==pvString) {
new (_wrap.blob) std::string(*static_cast<const std::string*>(buf));
} else {
memcpy(_wrap.blob, buf, ScalarTypeFunc::elementSize(type));
}
_stype = type;
}
AnyScalar(const AnyScalar& o)
:_stype(o._stype)
{
@@ -269,6 +281,16 @@ public:
operator bool_type() const { return !empty() ? &AnyScalar::swap : 0; }
#endif
//! Provide read-only access to underlying buffer.
//! For a string this is std::string::c_str().
const void* bufferUnsafe() const {
if(_stype==pvString) {
return as<std::string>().c_str();
} else {
return _wrap.blob;
}
}
/** Return reference to wrapped value */
template<typename T>
// T -> strip_const -> map to storage type -> add reference