26#include <unordered_map>
36template class ::IceInternal::Handle<::armarx::Variant>;
52 return static_cast<std::int8_t
>(i);
59 setInt(
static_cast<int>(value));
74 return static_cast<std::int16_t
>(i);
81 setInt(
static_cast<int>(value));
87 data =
new IntVariantData(
static_cast<int>(var));
99 return static_cast<std::int32_t
>(i);
106 setInt(
static_cast<int>(value));
112 data =
new LongVariantData(
static_cast<long>(var));
122 return static_cast<std::int64_t
>(i);
129 setLong(
static_cast<long>(value));
144 return static_cast<std::uint8_t
>(i);
151 setInt(
static_cast<int>(value));
166 return static_cast<std::uint16_t
>(i);
173 setInt(
static_cast<int>(value));
180 data =
new IntVariantData(
static_cast<int>(var));
192 std::numeric_limits<std::uint32_t>::max());
193 return static_cast<std::uint32_t
>(i);
200 setInt(
static_cast<int>(value));
207 data =
new LongVariantData(
static_cast<long>(var));
218 return static_cast<std::uint64_t
>(i);
226 setLong(
static_cast<long>(value));
232 data =
new FloatVariantData(var);
240 data =
new DoubleVariantData(var);
248 data =
new BoolVariantData(var);
256 data =
new StringVariantData(var);
323 IceUtil::Shared(source),
Ice::Object(source), VariantBase(source)
327 data = VariantDataPtr::dynamicCast(source.data->ice_clone());
346 throw LocalException(
347 "A Variant's type cannot be changed after it was set! Current Variant type: ")
351 this->typeId = typeId;
364 data =
new IntVariantData();
368 IntVariantDataPtr::dynamicCast(this->
data)->n = n;
382 data =
new LongVariantData();
386 LongVariantDataPtr::dynamicCast(this->
data)->n = n;
400 data =
new FloatVariantData();
405 FloatVariantDataPtr::dynamicCast(this->
data)->f = f;
419 data =
new DoubleVariantData();
424 DoubleVariantDataPtr::dynamicCast(this->
data)->d = d;
438 data =
new StringVariantData();
443 StringVariantDataPtr::dynamicCast(this->
data)->s = s;
457 data =
new BoolVariantData();
462 BoolVariantDataPtr::dynamicCast(this->
data)->b = b;
471 getType(), variantDataClass->getType(), __FUNCTION__);
474 data = variantDataClass ;
475 setType(variantDataClass->getType());
484 getType(), variantDataClass.getType(), __FUNCTION__);
487 data = variantDataClass.clone();
488 setType(variantDataClass.getType());
507 IntVariantData* dataPtr =
static_cast<IntVariantData*
>(this->
data.get());
526 LongVariantData* dataPtr =
static_cast<LongVariantData*
>(this->
data.get());
545 FloatVariantData* dataPtr =
static_cast<FloatVariantData*
>(this->
data.get());
564 DoubleVariantData* dataPtr =
static_cast<DoubleVariantData*
>(this->
data.get());
583 StringVariantData* dataPtr =
static_cast<StringVariantData*
>(this->
data.get());
602 BoolVariantData* dataPtr =
static_cast<BoolVariantData*
>(this->
data.get());
611 std::stringstream stream;
612 stream.precision(std::numeric_limits<double>::digits10);
616 stream <<
"Not Initialized";
656 VariantDataClassPtr ptr = VariantDataClassPtr::dynamicCast(this->
data);
664 stream << ptr->output();
693 return "UnknownType";
715 if (
data->ice_id() == VariantData::ice_staticId())
720 VariantDataClassPtr classPtr = VariantDataClassPtr::dynamicCast(
data);
724 return classPtr->validate();
739 getType(), prototype.getType(), __FUNCTION__);
742 data = VariantDataPtr::dynamicCast(prototype.ice_clone());
754 getType(), prototype->getType(), __FUNCTION__);
757 data = VariantDataPtr::dynamicCast(prototype->ice_clone());
772 data = VariantDataPtr::dynamicCast(prototype.data->ice_clone());
792 stream <<
"(UNKNOWNTYPE) ";
797 stream <<
"not Initialized ";
805 Variant::invalidate()
807 data =
new InvalidVariantData();
815 static std::unordered_map<std::string, VariantTypeId> idMap;
816 auto it = idMap.find(typeName);
818 if (it != idMap.end())
827 while ((ch = typeName[
index++]))
830 hash = ((hash << 5) + hash) ^ ch;
833 idMap[typeName] = hash;
837 std::map<VariantTypeId, std::string>&
840 static std::map<VariantTypeId, std::string> types = std::map<VariantTypeId, std::string>();
850 auto& typeMap = types();
851 std::map<VariantTypeId, std::string>::iterator it = typeMap.find(type);
854 if (it == types().end())
862 const std::map<VariantTypeId, std::string>&
872 std::pair<unsigned int, std::string> entry;
874 entry.second = typeName;
878 std::map<VariantTypeId, std::string>::iterator it = types().find(hash);
880 if (it != types().end() && typeName != it->second)
882 throw LocalException(
"A Type with the same hash value is already added. It has to be "
883 "renamed. TypeName: " +
887 Variant::types().insert(entry);
907 operator<<(std::ostream& stream,
const VariantDataClass& variant)
909 stream << variant.output();
The Variant class is described here: Variants.
bool getInitialized(const Ice::Current &c=Ice::emptyCurrent) const override
Tells if the Variant is properly initialized.
std::enable_if_t< std::is_base_of_v< VariantDataClass, T > > set(const VariantDataClassPtr &variantDataClass)
Template-based setter for the Variant's value for VariantDataClass-instances.
VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's internal type.
static const std::map< VariantTypeId, std::string > & getTypes()
Returns the mapping of currently registered types.
void setClass(const VariantDataClassPtr &variantDataClass)
Sets the Variant's value to variantDataClass.
Variant & operator=(int n)
virtual std::string getOutputValueOnly() const
Returns the formatted content of the Variant as a string.
void setLong(long n, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to n.
void setFloat(float f, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to f.
std::string getString(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as string.
void setInt(int n, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to n.
virtual VariantPtr clone() const
Returns a copy of the Variant.
int getInt(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as int.
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
bool getBool(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as bool.
void setString(const std::string &s, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to s.
std::enable_if_t< std::is_base_of_v< VariantDataClass, T >, IceInternal::Handle< T > > get() const
Template-based getter for the Variant's value.
void setBool(bool b, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to b.
std::string getTypeName(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's internal type.
static int hashTypeName(const std::string &typeName)
Compute and return a hash value for a given type name.
long getLong(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as long.
double getDouble(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as double.
static std::string typeToString(VariantTypeId typeId)
Return the name of the registered type typeId.
void output(std::ostream &stream) const
Outputs a formatted representation of the Variant to stream.
void setType(VariantTypeId typeId, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's type to typeId.
float getFloat(const Ice::Current &c=Ice::emptyCurrent) const override
Return the Variant's value as float.
bool validate(const Ice::Current &c=Ice::emptyCurrent) const override
Checks if the Variant is initialized and the stored value is valid with respect to the Variant's type...
void setDouble(double d, const Ice::Current &c=Ice::emptyCurrent) override
Sets the Variant's value to d.
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_CHECK_LESS_EQUAL(lhs, rhs)
This macro evaluates whether lhs is less or equal (<=) rhs and if it turns out to be false it will th...
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
const VariantTypeId String
const VariantTypeId Invalid
bool IsBasicType(VariantTypeId id)
const VariantTypeId Double
const VariantTypeId Float
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::ostream & operator<<(std::ostream &os, const PythonApplicationManager::Paths &paths)
IceInternal::Handle< Variant > VariantPtr