VariantContainer.h
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5*
6* ArmarX is free software; you can redistribute it and/or modify
7* it under the terms of the GNU General Public License version 2 as
8* published by the Free Software Foundation.
9*
10* ArmarX is distributed in the hope that it will be useful, but
11* WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17*
18* @package ArmarXCore::core
19* @author Kai Welke (welke@kit.edu)
20* @date 2011
21* @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22* GNU General Public License
23*/
24
25#pragma once
26
27
28#include <map>
29#include <string>
30
31#include <IceUtil/Handle.h>
32
34#include <ArmarXCore/interface/observers/VariantBase.h>
35#include <ArmarXCore/interface/observers/VariantContainers.h>
37
38namespace armarx::VariantType
39{
40 const VariantTypeId VariantContainer = Variant::addTypeName("::armarx::VariantContainerBase");
41}
42
43namespace armarx
44{
45 class VariantContainer;
47
48
49 class SingleVariant;
51
52 /**
53 * \class VariantContainer
54 * \ingroup VariantsGrp
55 * \brief VariantContainer is the base class of all other Variant container classes.
56 *
57 * Each VariantContainer can contain values of the types
58 *
59 * \li VariantContainer or subclasses thereof
60 * \li SingleVariant
61 *
62 * Since VariantContainer inherits from VariantDataClass it is possible
63 * to put a VariantContainer into a Variant to send it via Ice.
64 * \see StringValueMap
65 * \see SingleTypeVariantList
66 *
67 \code
68 // VariantContainer can be replaced with any subclass of it
69 armarx::VariantContainerPtr variantContainer;
70 // create variant from VariantContainer
71 armarx::VariantPtr variant = new armarx::Variant(variantContainer);
72 // get VariantContainer from Variant
73 armarx::VariantContainerPtr variantContainer2 = variant->get<armarx::VariantContainer>();
74 if (variantContainer2)
75 {
76 // work with the container
77 }
78 else
79 {
80 // value of the variant was not a VariantContainer
81 }
82 \endcode
83 */
84 class ARMARXCORE_IMPORT_EXPORT VariantContainer : virtual public VariantContainerBase
85 {
86 public:
87 ContainerTypePtr getContainerType(const Ice::Current& c = Ice::emptyCurrent) const override;
88 void setContainerType(const ContainerTypePtr& containerType,
89 const Ice::Current& c = Ice::emptyCurrent) override;
90
91 // VariantDataClass interface
92 public:
93 VariantDataClassPtr clone(const Ice::Current& c = Ice::emptyCurrent) const override;
94 std::string output(const Ice::Current& c = Ice::emptyCurrent) const override;
95 Ice::Int getType(const Ice::Current& c = Ice::emptyCurrent) const override;
96 bool validate(const Ice::Current& c = Ice::emptyCurrent) override;
97 };
98
99 /**
100 * \class SingleVariant
101 * \ingroup VariantsGrp
102 * \brief The SingleVariant class is required to store single Variant instances in VariantContainer subclasses.
103 *
104 * Without this class the compiler would not be able to compile code which is storing single Variants instead of
105 * VariantContainers as values inside a VariantContainer instance .
106 */
108 virtual public VariantContainer,
109 virtual public SingleVariantBase
110 {
111 public:
113 SingleVariant(const Variant& variant);
114 SingleVariant(Variant& variant);
115 SingleVariant(Variant&& variant);
116 SingleVariant(const SingleVariant& source);
117 SingleVariant& operator=(const SingleVariant& source);
118 VariantContainerBasePtr
119 cloneContainer(const ::Ice::Current& = Ice::emptyCurrent) const override;
120 Ice::ObjectPtr ice_clone() const override;
121 VariantBasePtr getElementBase(const Ice::Current& = Ice::emptyCurrent) const override;
122 VariantPtr get() const;
123 void setVariant(const VariantPtr& variant);
124
125 int getSize(const ::Ice::Current& = Ice::emptyCurrent) const override;
126 ContainerTypePtr getContainerType(const Ice::Current& c = Ice::emptyCurrent) const override;
127 void setContainerType(const ContainerTypePtr& containerType,
128 const Ice::Current& c = Ice::emptyCurrent) override;
129 static VariantTypeId getStaticType(const Ice::Current& c = Ice::emptyCurrent);
130
131 // int getSubType(const::Ice::Current & = Ice::emptyCurrent) const { return subType;}
132 void
133 clear(const ::Ice::Current& = Ice::emptyCurrent) override
134 {
135 }
136
137 bool validateElements(const ::Ice::Current& = Ice::emptyCurrent) override;
138
139 public: // serialization
140 void serialize(const ObjectSerializerBasePtr& serializer,
141 const ::Ice::Current& = Ice::emptyCurrent) const override;
142 void deserialize(const ObjectSerializerBasePtr& serializer,
143 const ::Ice::Current& = Ice::emptyCurrent) override;
144
145 template <class T>
146 static T
147 fromString(const std::string& s)
148 {
149 std::istringstream stream(s);
150 T t;
151 stream >> t;
152 return t;
153 }
154
155 static std::string getTypePrefix();
156
157 // VariantContainerBase interface
158 public:
159 std::string toString(const Ice::Current& c) const override;
160 };
161
162 class ContainerDummy : virtual public VariantContainer
163 {
164 public:
166 ContainerDummy(const ContainerDummy& source);
167 VariantContainerBasePtr
168 cloneContainer(const Ice::Current& = Ice::emptyCurrent) const override;
169 Ice::ObjectPtr ice_clone() const override;
170 ContainerTypePtr getContainerType(const Ice::Current& = Ice::emptyCurrent) const override;
171 void setContainerType(const ContainerTypePtr& containerType,
172 const Ice::Current& = Ice::emptyCurrent) override;
173
174 void
175 clear(const Ice::Current& = Ice::emptyCurrent) override
176 {
177 }
178
179 int getSize(const Ice::Current& = Ice::emptyCurrent) const override;
180 bool validateElements(const Ice::Current& = Ice::emptyCurrent) override;
181
182 public: // serialization
183 void
184 serialize(const ObjectSerializerBasePtr& serializer,
185 const ::Ice::Current& = Ice::emptyCurrent) const override
186 {
187 }
188
189 void
190 deserialize(const ObjectSerializerBasePtr& serializer,
191 const ::Ice::Current& = Ice::emptyCurrent) override
192 {
193 }
194
195 // VariantContainerBase interface
196 public:
197 std::string toString(const Ice::Current& c) const override;
198 };
199
200 class ContainerTypeI : virtual public ContainerType
201 {
202 public:
204 {
205 }
206
207 ContainerTypeI(VariantTypeId variantType);
208 ContainerTypePtr clone(const Ice::Current& = Ice::emptyCurrent) const override;
209 };
210
212
214 {
215 public:
216 VariantContainerType(std::string containerType);
217 const ContainerTypeI operator()(VariantTypeId typeId) const;
218 const ContainerTypeI operator()(const ContainerType& subType) const;
219 static bool compare(const ContainerTypePtr& type1, const ContainerTypePtr& secondType);
220 static std::string allTypesToString(const ContainerTypePtr& type);
221 static ContainerTypePtr FromString(const std::string& typeStr);
222 static std::string GetInnerType(const std::string& typeStr);
223 static std::string GetInnerType(ContainerTypePtr type);
224
225 private:
226 std::string containerType;
227 ContainerTypePtr thisType;
228 };
229} // namespace armarx
230
231namespace armarx::VariantType
232{
235}
236
237extern template class ::IceInternal::Handle<::armarx::SingleVariant>;
238extern template class ::IceInternal::Handle<::armarx::ContainerTypeI>;
#define ARMARXCORE_IMPORT_EXPORT
constexpr T c
void setContainerType(const ContainerTypePtr &containerType, const Ice::Current &=Ice::emptyCurrent) override
VariantContainerBasePtr cloneContainer(const Ice::Current &=Ice::emptyCurrent) const override
int getSize(const Ice::Current &=Ice::emptyCurrent) const override
void deserialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
Ice::ObjectPtr ice_clone() const override
void serialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
void clear(const Ice::Current &=Ice::emptyCurrent) override
std::string toString(const Ice::Current &c) const override
ContainerTypePtr getContainerType(const Ice::Current &=Ice::emptyCurrent) const override
bool validateElements(const Ice::Current &=Ice::emptyCurrent) override
ContainerTypePtr clone(const Ice::Current &=Ice::emptyCurrent) const override
The SingleVariant class is required to store single Variant instances in VariantContainer subclasses.
void setContainerType(const ContainerTypePtr &containerType, const Ice::Current &c=Ice::emptyCurrent) override
void clear(const ::Ice::Current &=Ice::emptyCurrent) override
VariantContainerBasePtr cloneContainer(const ::Ice::Current &=Ice::emptyCurrent) const override
VariantBasePtr getElementBase(const Ice::Current &=Ice::emptyCurrent) const override
static VariantTypeId getStaticType(const Ice::Current &c=Ice::emptyCurrent)
SingleVariant & operator=(const SingleVariant &source)
int getSize(const ::Ice::Current &=Ice::emptyCurrent) const override
void setVariant(const VariantPtr &variant)
Ice::ObjectPtr ice_clone() const override
ContainerTypePtr getContainerType(const Ice::Current &c=Ice::emptyCurrent) const override
static std::string getTypePrefix()
static T fromString(const std::string &s)
VariantContainerType(std::string containerType)
static std::string allTypesToString(const ContainerTypePtr &type)
const ContainerTypeI operator()(VariantTypeId typeId) const
static bool compare(const ContainerTypePtr &type1, const ContainerTypePtr &secondType)
static ContainerTypePtr FromString(const std::string &typeStr)
static std::string GetInnerType(const std::string &typeStr)
VariantContainer is the base class of all other Variant container classes.
void setContainerType(const ContainerTypePtr &containerType, const Ice::Current &c=Ice::emptyCurrent) override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
Ice::Int getType(const Ice::Current &c=Ice::emptyCurrent) const override
ContainerTypePtr getContainerType(const Ice::Current &c=Ice::emptyCurrent) const override
The Variant class is described here: Variants.
Definition Variant.h:224
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
Definition Variant.cpp:869
const VariantTypeId VariantContainer
const VariantContainerType SingleVariantContainer
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< SingleVariant > SingleVariantPtr
IceInternal::Handle< Variant > VariantPtr
Definition Variant.h:41
IceInternal::Handle< VariantContainer > VariantContainerPtr
Ice::Int VariantTypeId
Definition Variant.h:43
::IceInternal::Handle<::armarx::VariantBase > VariantBasePtr
IceInternal::Handle< ContainerTypeI > ContainerTypeIPtr