SpatialUnit.hpp
Go to the documentation of this file.
1 /*
2 
3  This file is part of OpenFLUID software
4  Copyright(c) 2007, INRA - Montpellier SupAgro
5 
6 
7  == GNU General Public License Usage ==
8 
9  OpenFLUID is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  OpenFLUID is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with OpenFLUID. If not, see <http://www.gnu.org/licenses/>.
21 
22 
23  == Other Usage ==
24 
25  Other Usage means a use of OpenFLUID that is inconsistent with the GPL
26  license, and requires a written agreement between You and INRA.
27  Licensees for Other Usage of OpenFLUID may use this file in accordance
28  with the terms contained in the written agreement between You and INRA.
29 
30 */
31 
32 /**
33  @file SpatialUnit.hpp
34 
35  @author Jean-Christophe Fabre <jean-christophe.fabre@supagro.inra.fr>
36 */
37 
38 
39 
40 #ifndef __OPENFLUID_CORE_SPATIALUNIT_HPP__
41 #define __OPENFLUID_CORE_SPATIALUNIT_HPP__
42 
43 
44 #include <map>
45 #include <string>
46 
47 #include <openfluid/dllexport.hpp>
53 
54 
55 class OGRGeometry;
56 
57 
58 namespace openfluid { namespace core {
59 
60 
61 /**
62  Type for a hashmap of lists of units, indexed by UnitClass
63 */
64 typedef std::map<UnitsClass_t,UnitsCollection> UnitsListByClassMap_t;
65 
66 
67 /**
68  Type for a list of pointers on Unit
69 */
70 typedef std::list<SpatialUnit*> UnitsPtrList_t;
71 
72 
73 /**
74  Type for a map associating a unit class to a list of pointers on Unit
75 */
76 typedef std::map<UnitsClass_t,UnitsPtrList_t> LinkedUnitsListByClassMap_t;
77 
78 
79 /**
80  Class defining a spatial unit
81 
82  example of use:
83  @code
84  openfluid::core::SpatialUnit aUnit;
85  openfluid::core::SpatialUnit* aUnitPtr;
86  openfluid::core::UnitsClass_t aUnitClass;
87  openfluid::core::UnitID_t aUnitID;
88  openfluid::core::UnitsPtrList_t* aUnitListPtr;
89 
90 
91  // get unit ID
92  aUnitID = aUnit.getID();
93  // or (pointed unit)
94  aUnitID = aUnitPtr->getID();
95 
96  // get unit class
97  aUnitClass = aUnit.getClass();
98  // or (pointed unit)
99  aUnitClass = aUnitPtr->getClass();
100 
101  // get connected units (to and from)
102  aUnitListPtr = aUnit.toSpatialUnits("foo");
103  // or
104  aUnitListPtr = aUnit.fromSpatialUnits("bar");
105  @endcode
106 */
108 {
109  private:
110 
111  UnitID_t m_ID;
112 
113  UnitsClass_t m_Class;
114 
115  // TODO use openfluid::core::PcsOrd_t instead
116  unsigned int m_PcsOrder;
117 
118  LinkedUnitsListByClassMap_t m_FromUnits;
119 
120  LinkedUnitsListByClassMap_t m_ToUnits;
121 
122  LinkedUnitsListByClassMap_t m_ParentUnits;
123 
124  LinkedUnitsListByClassMap_t m_ChildrenUnits;
125 
126  Attributes m_Attributes;
127 
128  Variables m_Variables;
129 
130  EventsCollection m_Events;
131 
132  OGRGeometry* m_Geometry;
133 
134 
135  public:
136 
137  /*
138  Constructor
139  @param[in] aClass the class of the unit
140  @param[in] anID the ID of the unit
141  @param[in] aPcsOrder the process order of the unit
142  */
143  SpatialUnit(const UnitsClass_t& aClass, const UnitID_t anID, const PcsOrd_t aPcsOrder);
144 
145  /*
146  Destructor
147  */
148  ~SpatialUnit();
149 
150  /**
151  Returns the process order of the unit
152  */
153  inline PcsOrd_t getProcessOrder() const
154  { return m_PcsOrder; };
155 
156  /**
157  Returns the ID of the unit
158  */
159  inline UnitID_t getID() const
160  { return m_ID; };
161 
162 
163  /**
164  Returns the class of the unit
165  */
166  inline UnitsClass_t getClass() const
167  { return m_Class; };
168 
169  bool addToUnit(SpatialUnit* aUnit);
170 
171  bool addFromUnit(SpatialUnit* aUnit);
172 
173  bool addParentUnit(SpatialUnit* aUnit);
174 
175  bool addChildUnit(SpatialUnit* aUnit);
176 
177  /**
178  Returns a list of units, of the requested class, connected to this unit.
179  Returns nullptr if no units of the requested class are connected to this unit.
180  @param[in] aClass the requested class
181  */
182  UnitsPtrList_t* toSpatialUnits(const UnitsClass_t& aClass);
183 
184  const UnitsPtrList_t* toSpatialUnits(const UnitsClass_t& aClass) const;
185 
186  /**
187  @deprecated Since version 2.1.0. Use openfluid::core::SpatialUnit::toSpatialUnits(const UnitsClass_t&) instead
188  */
189  UnitsPtrList_t* getToUnits(const UnitsClass_t& aClass) OPENFLUID_DEPRECATED
190  { return toSpatialUnits(aClass); }
191 
192  /**
193  @deprecated Since version 2.1.0.
194  Use openfluid::core::SpatialUnit::toSpatialUnits(const UnitsClass_t&) const instead
195  */
196  const UnitsPtrList_t* getToUnits(const UnitsClass_t& aClass) const OPENFLUID_DEPRECATED
197  { return toSpatialUnits(aClass); }
198 
199  /**
200  Returns a list of units, of the requested class, connected from this unit.
201  Returns nullptr if no units of the requested class are connected from this unit.
202  @param[in] aClass the requested class
203  */
204  UnitsPtrList_t* fromSpatialUnits(const UnitsClass_t& aClass);
205 
206  const UnitsPtrList_t* fromSpatialUnits(const UnitsClass_t& aClass) const;
207 
208 
209  /**
210  @deprecated Since version 2.1.0. Use openfluid::core::SpatialUnit::fromSpatialUnits(const UnitsClass_t&) instead
211  */
212  UnitsPtrList_t* getFromUnits(const UnitsClass_t& aClass) OPENFLUID_DEPRECATED
213  { return fromSpatialUnits(aClass); }
214 
215  /**
216  @deprecated Since version 2.1.0.
217  Use openfluid::core::SpatialUnit::fromSpatialUnits(const UnitsClass_t&) const instead
218  */
219  const UnitsPtrList_t* getFromUnits(const UnitsClass_t& aClass) const
220  { return fromSpatialUnits(aClass); }
221 
222  /**
223  Returns a list of parent units of the requested class.
224  Returns nullptr if this unit has no parent
225  @param[in] aClass the requested class
226  */
227  UnitsPtrList_t* parentSpatialUnits(const UnitsClass_t& aClass);
228 
229  const UnitsPtrList_t* parentSpatialUnits(const UnitsClass_t& aClass) const;
230 
231  /**
232  @deprecated Since version 2.1.0. Use openfluid::core::SpatialUnit::parentSpatialUnits(const UnitsClass_t&) instead
233  */
234  UnitsPtrList_t* getParentUnits(const UnitsClass_t& aClass) OPENFLUID_DEPRECATED
235  { return parentSpatialUnits(aClass); }
236 
237  /**
238  @deprecated Since version 2.1.0.
239  Use openfluid::core::SpatialUnit::parentSpatialUnits(const UnitsClass_t&) const instead
240  */
241  const UnitsPtrList_t* getParentUnits(const UnitsClass_t& aClass) const OPENFLUID_DEPRECATED
242  { return parentSpatialUnits(aClass); }
243 
244  /**
245  Returns a list of children units of the requested class.
246  Returns nullptr if this unit has no child
247  @param[in] aClass the requested class
248  */
249  UnitsPtrList_t* childSpatialUnits(const UnitsClass_t& aClass);
250 
251  const UnitsPtrList_t* childSpatialUnits(const UnitsClass_t& aClass) const;
252 
253  /**
254  @deprecated Since version 2.1.0. Use openfluid::core::SpatialUnit::childSpatialUnits(const UnitsClass_t&) instead
255  */
256  UnitsPtrList_t* getChildrenUnits(const UnitsClass_t& aClass) OPENFLUID_DEPRECATED
257  { return childSpatialUnits(aClass); }
258 
259  /**
260  @deprecated Since version 2.1.0.
261  Use openfluid::core::SpatialUnit::childSpatialUnits(const UnitsClass_t&) const instead
262  */
263  const UnitsPtrList_t* getChildrenUnits(const UnitsClass_t& aClass) const OPENFLUID_DEPRECATED
264  { return childSpatialUnits(aClass); }
265 
267  { return &m_Attributes; };
268 
269  inline const Attributes* attributes() const
270  { return &m_Attributes; };
271 
273  { return &m_Variables; };
274 
275  const Variables* variables() const
276  { return &m_Variables; };
277 
279  { return &m_Events; };
280 
281  inline const EventsCollection* events() const
282  { return &m_Events; };
283 
284  void streamContents(std::ostream& OStream);
285 
286  void setProcessOrder(unsigned int PcsOrder)
287  { m_PcsOrder = PcsOrder; };
288 
289  OGRGeometry* geometry()
290  { return m_Geometry; };
291 
292  const OGRGeometry* geometry() const
293  { return m_Geometry; };
294 
295  bool importGeometryFromWkt(const std::string& WKT);
296 
297  std::string exportGeometryToWkt() const;
298 
299  void deleteGeometry();
300 
301 };
302 
303 
305 
306 
307 } } // namespace openfluid::core
308 
309 
310 #endif /* __OPENFLUID_CORE_SPATIALUNIT_HPP__ */
311 
std::string UnitsClass_t
Definition: TypeDefs.hpp:71
UnitsClass_t getClass() const
Definition: SpatialUnit.hpp:166
Definition: Variables.hpp:49
const Attributes * attributes() const
Definition: SpatialUnit.hpp:269
std::list< SpatialUnit * > UnitsPtrList_t
Definition: SpatialUnit.hpp:70
Attributes * attributes()
Definition: SpatialUnit.hpp:266
Class defining a collection of discrete events.
Definition: EventsCollection.hpp:59
const EventsCollection * events() const
Definition: SpatialUnit.hpp:281
SpatialUnit Unit OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:304
PcsOrd_t getProcessOrder() const
Definition: SpatialUnit.hpp:153
const UnitsPtrList_t * getParentUnits(const UnitsClass_t &aClass) const OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:241
UnitsPtrList_t * getChildrenUnits(const UnitsClass_t &aClass) OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:256
UnitsPtrList_t * getParentUnits(const UnitsClass_t &aClass) OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:234
UnitsPtrList_t * getToUnits(const UnitsClass_t &aClass) OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:189
const OGRGeometry * geometry() const
Definition: SpatialUnit.hpp:292
Definition: Attributes.hpp:57
const UnitsPtrList_t * getToUnits(const UnitsClass_t &aClass) const OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:196
Definition: SpatialUnit.hpp:107
Definition: ApplicationException.hpp:47
const UnitsPtrList_t * getChildrenUnits(const UnitsClass_t &aClass) const OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:263
#define OPENFLUID_API
Definition: dllexport.hpp:87
EventsCollection * events()
Definition: SpatialUnit.hpp:278
const UnitsPtrList_t * getFromUnits(const UnitsClass_t &aClass) const
Definition: SpatialUnit.hpp:219
int PcsOrd_t
Definition: TypeDefs.hpp:66
UnitID_t getID() const
Definition: SpatialUnit.hpp:159
OGRGeometry * geometry()
Definition: SpatialUnit.hpp:289
Variables * variables()
Definition: SpatialUnit.hpp:272
unsigned int UnitID_t
Definition: TypeDefs.hpp:61
void setProcessOrder(unsigned int PcsOrder)
Definition: SpatialUnit.hpp:286
std::map< UnitsClass_t, UnitsCollection > UnitsListByClassMap_t
Definition: SpatialUnit.hpp:64
UnitsPtrList_t * getFromUnits(const UnitsClass_t &aClass) OPENFLUID_DEPRECATED
Definition: SpatialUnit.hpp:212
const Variables * variables() const
Definition: SpatialUnit.hpp:275
std::map< UnitsClass_t, UnitsPtrList_t > LinkedUnitsListByClassMap_t
Definition: SpatialUnit.hpp:76