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 
38 namespace armarx::VariantType
39 {
40  const VariantTypeId VariantContainer = Variant::addTypeName("::armarx::VariantContainerBase");
41 }
42 
43 namespace 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:
112  SingleVariant();
113  SingleVariant(const Variant& variant);
114  SingleVariant(Variant& variant);
115  SingleVariant(Variant&& variant);
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:
165  ContainerDummy();
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 
231 namespace armarx::VariantType
232 {
235 }
236 
237 extern template class ::IceInternal::Handle<::armarx::SingleVariant>;
238 extern template class ::IceInternal::Handle<::armarx::ContainerTypeI>;
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
armarx::ContainerDummy::toString
std::string toString(const Ice::Current &c) const override
Definition: VariantContainer.cpp:366
armarx::VariantContainerType::GetInnerType
static std::string GetInnerType(const std::string &typeStr)
Definition: VariantContainer.cpp:301
armarx::SingleVariant::getTypePrefix
static std::string getTypePrefix()
Definition: VariantContainer.cpp:159
armarx::ContainerDummy::getContainerType
ContainerTypePtr getContainerType(const Ice::Current &=Ice::emptyCurrent) const override
Definition: VariantContainer.cpp:342
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
armarx::ContainerDummy::getSize
int getSize(const Ice::Current &=Ice::emptyCurrent) const override
Definition: VariantContainer.cpp:354
armarx::SingleVariant::clear
void clear(const ::Ice::Current &=Ice::emptyCurrent) override
Definition: VariantContainer.h:133
armarx::ContainerDummy::serialize
void serialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
Definition: VariantContainer.h:184
armarx::ContainerDummy::ice_clone
Ice::ObjectPtr ice_clone() const override
Definition: VariantContainer.cpp:336
armarx::ContainerTypeI::ContainerTypeI
ContainerTypeI()
Definition: VariantContainer.h:203
IceInternal::Handle
Definition: forward_declarations.h:8
armarx::ContainerDummy::setContainerType
void setContainerType(const ContainerTypePtr &containerType, const Ice::Current &=Ice::emptyCurrent) override
Definition: VariantContainer.cpp:348
armarx::VariantContainerType::VariantContainerType
VariantContainerType(std::string containerType)
Definition: VariantContainer.cpp:191
armarx::ContainerTypeI::clone
ContainerTypePtr clone(const Ice::Current &=Ice::emptyCurrent) const override
Definition: VariantContainer.cpp:178
armarx::SingleVariant
The SingleVariant class is required to store single Variant instances in VariantContainer subclasses.
Definition: VariantContainer.h:107
armarx::VariantContainerType::compare
static bool compare(const ContainerTypePtr &type1, const ContainerTypePtr &secondType)
Definition: VariantContainer.cpp:219
armarx::VariantContainerType::operator()
const ContainerTypeI operator()(VariantTypeId typeId) const
Definition: VariantContainer.cpp:199
armarx::ContainerDummy::deserialize
void deserialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
Definition: VariantContainer.h:190
armarx::VariantType
Definition: ChannelRef.h:167
armarx::SingleVariant::fromString
static T fromString(const std::string &s)
Definition: VariantContainer.h:147
armarx::VariantTypeId
Ice::Int VariantTypeId
Definition: Variant.h:43
boost::source
Vertex source(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:661
armarx::VariantContainer
VariantContainer is the base class of all other Variant container classes.
Definition: VariantContainer.h:84
armarx::VariantContainerType
Definition: VariantContainer.h:213
armarx::navigation::client::validate
void validate(const std::vector< WaypointTarget > &path)
Definition: ice_conversions.h:70
armarx::ContainerDummy::ContainerDummy
ContainerDummy()
Definition: VariantContainer.cpp:316
armarx::VariantType::SingleVariantContainer
const VariantContainerType SingleVariantContainer
Definition: VariantContainer.h:233
armarx::ContainerTypeI
Definition: VariantContainer.h:200
armarx::viz::toString
const char * toString(InteractionFeedbackType type)
Definition: Interaction.h:28
armarx::VariantType::Int
const VariantTypeId Int
Definition: Variant.h:917
ImportExport.h
armarx::ContainerDummy::cloneContainer
VariantContainerBasePtr cloneContainer(const Ice::Current &=Ice::emptyCurrent) const override
Definition: VariantContainer.cpp:330
armarx::aron::type::ObjectPtr
std::shared_ptr< Object > ObjectPtr
Definition: Object.h:36
ARMARXCORE_IMPORT_EXPORT
#define ARMARXCORE_IMPORT_EXPORT
Definition: ImportExport.h:38
T
float T
Definition: UnscentedKalmanFilterTest.cpp:38
Variant.h
armarx::VariantContainerType::FromString
static ContainerTypePtr FromString(const std::string &typeStr)
Definition: VariantContainer.cpp:281
armarx::ContainerDummy
Definition: VariantContainer.h:162
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx::ContainerDummy::validateElements
bool validateElements(const Ice::Current &=Ice::emptyCurrent) override
Definition: VariantContainer.cpp:360
armarx::ContainerDummy::clear
void clear(const Ice::Current &=Ice::emptyCurrent) override
Definition: VariantContainer.h:175
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::Variant::addTypeName
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
Definition: Variant.cpp:869
armarx::VariantContainerType::allTypesToString
static std::string allTypesToString(const ContainerTypePtr &type)
Definition: VariantContainer.cpp:250