Value::tryAs() tryFrom()

This commit is contained in:
Michael Davidsaver
2019-12-18 18:25:11 -08:00
parent d2c4457a08
commit 35dd24f46f
2 changed files with 43 additions and 14 deletions
+24
View File
@@ -241,6 +241,18 @@ void Value::copyOut(void *ptr, StoreType type) const
throw NoConvert();
}
bool Value::tryCopyOut(void *ptr, StoreType type) const
{
try {
copyOut(ptr, type);
return true;
}catch(NoField&){
return false;
}catch(NoConvert&){
return false;
}
}
namespace {
// C-style cast between scalar storage types, and print to string (base 10)
template<typename Dest>
@@ -342,6 +354,18 @@ void Value::copyIn(const void *ptr, StoreType type)
mark();
}
bool Value::tryCopyIn(const void *ptr, StoreType type)
{
try {
copyIn(ptr, type);
return true;
}catch(NoField&){
return false;
}catch(NoConvert&){
return false;
}
}
void Value::traverse(const std::string &expr, bool modify)
{
size_t pos=0;
+19 -14
View File
@@ -286,14 +286,16 @@ public:
// use with caution
void copyOut(void *ptr, StoreType type) const;
//bool tryCopyOut(void *ptr, impl::StoreType type) const;
bool tryCopyOut(void *ptr, StoreType type) const;
void copyIn(const void *ptr, StoreType type);
//bool tryCopyIn(const void *ptr, impl::StoreType type);
bool tryCopyIn(const void *ptr, StoreType type);
// template<typename T>
// inline bool tryAs(T& val) const {
// return tryCopyOut(&val, std::type_index(typeid(std::decay<T>::type)));
// }
template<typename T>
inline bool tryAs(T& val) const {
typedef impl::StorageMap<typename std::decay<T>::type> map_t;
typename map_t::store_t ret;
return tryCopyOut(&ret, map_t::code);
}
/** Extract value from field.
*/
@@ -304,15 +306,18 @@ public:
copyOut(&ret, map_t::code);
return ret;
}
// template<typename T>
// void as(T& val) const {
// copyOut(&val, std::type_index(typeid(typename std::decay<T>::type)));
// }
// template<typename T>
// inline bool tryFrom(const T& val) {
// return tryCopyIn(&val, std::type_index(typeid(std::decay<T>::type)));
// }
template<typename T>
inline void as(T& val) const {
val = this->as<T>();
}
template<typename T>
inline bool tryFrom(const T& val) {
typedef impl::StorageMap<typename std::decay<T>::type> map_t;
typename map_t::store_t norm(val);
return copyIn(&norm, map_t::code);
}
template<typename T>
void from(const T& val) {