26 #include <unordered_map>
36 template class ::IceInternal::Handle<::armarx::Variant>;
41 Variant::Variant(
const std::int8_t& var,
void*) :
Variant(static_cast<
std::int32_t>(var))
47 Variant::get<std::int8_t>()
const
52 return static_cast<std::int8_t
>(i);
57 Variant::set<std::int8_t>(
const std::int8_t&
value)
59 setInt(
static_cast<int>(
value));
69 Variant::get<std::int16_t>()
const
74 return static_cast<std::int16_t
>(i);
79 Variant::set<std::int16_t>(
const std::int16_t&
value)
81 setInt(
static_cast<int>(
value));
87 data =
new IntVariantData(
static_cast<int>(var));
94 Variant::get<std::int32_t>()
const
99 return static_cast<std::int32_t
>(i);
104 Variant::set<std::int32_t>(
const std::int32_t&
value)
106 setInt(
static_cast<int>(
value));
112 data =
new LongVariantData(
static_cast<long>(var));
119 Variant::get<std::int64_t>()
const
122 return static_cast<std::int64_t
>(i);
127 Variant::set<std::int64_t>(
const std::int64_t&
value)
129 setLong(
static_cast<long>(
value));
139 Variant::get<std::uint8_t>()
const
144 return static_cast<std::uint8_t
>(i);
149 Variant::set<std::uint8_t>(
const std::uint8_t&
value)
151 setInt(
static_cast<int>(
value));
161 Variant::get<std::uint16_t>()
const
166 return static_cast<std::uint16_t
>(i);
171 Variant::set<std::uint16_t>(
const std::uint16_t&
value)
173 setInt(
static_cast<int>(
value));
180 data =
new IntVariantData(
static_cast<int>(var));
187 Variant::get<std::uint32_t>()
const
193 return static_cast<std::uint32_t
>(i);
198 Variant::set<std::uint32_t>(
const std::uint32_t&
value)
200 setInt(
static_cast<int>(
value));
207 data =
new LongVariantData(
static_cast<long>(var));
214 Variant::get<std::uint64_t>()
const
218 return static_cast<std::uint64_t
>(i);
223 Variant::set<std::uint64_t>(
const std::uint64_t&
value)
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);
263 Variant::get<bool>()
const
270 Variant::get<float>()
const
277 Variant::get<double>()
const
284 Variant::get<std::string>()
const
291 Variant::set<bool>(
const bool&
value)
298 Variant::set<float>(
const float&
value)
305 Variant::set<double>(
const double&
value)
312 Variant::set<std::string>(
const std::string&
value)
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();