Ilwis-Objects  1.0
GIS and Remote Sensing framework for data access and processing
 All Classes Functions Enumerations Pages
itemdomain.h
1 #ifndef ITEMDOMAIN_H
2 #define ITEMDOMAIN_H
3 
4 #include "range.h"
5 #include "itemrange.h"
6 #include "itemiterator.h"
7 
8 namespace Ilwis {
9 
10 class ItemRange;
11 
32 template<class D> class ItemDomain : public Domain
33 {
34 public:
35  template<typename T> friend class ItemIterator;
36 
41  }
42 
47  ItemDomain(const Resource& resource) : Domain(resource) {
48  }
49 
50  ItemDomain(Range *rng) : Domain() {
51  range(rng);
52  }
53 
54  ~ItemDomain() {
55  }
63  Domain::Containement contains(const QVariant& val) const{
64  if ( parent().isValid() && !isStrict())
65  if (parent()->contains(val) == Domain::cSELF)
66  return Domain::cPARENT;
67 
68  if(item(val.toString()) != 0)
69  return Domain::cSELF;
70 
71  return Domain::cNONE;
72  }
73 
84  bool isCompatibleWith(const IDomain& dom) const {
85  if ( !dom->isValid())
86  return false;
87  if(dom->ilwisType() != itITEMDOMAIN)
88  return false;
89  if (!valueType() != dom->valueType())
90  return false;
91  IlwisData<ItemDomain<D>> itemdom = dom.get<ItemDomain<D>>();
92  if ( itemdom->theme() ==sUNDEF && !itemdom->parent().isValid())
93  return false;
94  if ( itemdom->parent().isValid() && parent().isValid()){
95  return itemdom->parent() == parent();
96  }
97  return itemdom->theme() == theme();
98 
99  }
100 
107  QVariant impliedValue(const QVariant& v) const {
108  if (_range.isNull()) {
109  ERROR1(ERR_NO_INITIALIZED_1, name());
110  return sUNDEF;
111  }
112  return _range->impliedValue(v);
113  }
114 
121  SPDomainItem item(quint32 index) const {
122  if (_range.isNull()) {
123  ERROR1(ERR_NO_INITIALIZED_1, name());
124  return SPDomainItem();
125  }
126  return _range->item(index) ;
127  }
128 
135  SPDomainItem item(const QString& nam) const{
136  if (_range.isNull()) {
137  ERROR1(ERR_NO_INITIALIZED_1, name());
138  return SPDomainItem();
139  }
140  if(parent().isValid() && !isStrict()) {
141  IDomain dm = parent();
142  IlwisData<ItemDomain<D>> parentdom = dm.get<ItemDomain<D>>();
143  return parentdom->item(nam);
144  }
145  return _range->item(nam) ;
146  }
147 
154  void addItem(DomainItem* thing) {
155  if (thing == 0)
156  return;
157  if ( isReadOnly())
158  return;
159  changed(true);
160  if ( _range.isNull()) {
161  _range.reset(D::createRange());
162  }
163  if (parent().isValid()) {
164  IDomain dm = parent();
165  IlwisData<ItemDomain<D>> parentdom = dm.get<ItemDomain<D>>();
166  if(!parentdom.isValid()){
167  ERROR2(ERR_COULD_NOT_CONVERT_2,TR("domain"), TR("correct item domain"));
168  delete thing;
169  return;
170  }
171  SPDomainItem item = parentdom->item(thing->name());
172  if (item.isNull()){
173  WARN2(WARN_NOT_PART_OF2,thing->name(), TR("parent domain"));
174  delete thing;
175  return;
176  }
177  delete thing;
178  _range->add(item);
179  }else
180  _range->add(thing);
181  }
182 
188  void removeItem(const QString& nme){
189  if ( isReadOnly())
190  return;
191  if (_range.isNull()) {
192  ERROR1(ERR_NO_INITIALIZED_1, name());
193  return ;
194  }
195  changed(true);
196  if ( _childDomains.size() > 0) {
197  for(auto childid: _childDomains) {
198  IlwisData<ItemDomain<D>> childDom = mastercatalog()->get(childid.first) ;
199  if ( childDom.isValid()) {
200  if ( childDom->contains(nme) == Domain::cSELF) {
201  WARN2(WARN_PART_OF2,nme, TR("related/child domain"));
202  return;
203  }
204  }
205  }
206  }
207  _range->remove(nme);
208  }
209 
216  void range(Range *rng){
217  if ( isReadOnly())
218  return;
219  changed(true);
220  if ( rng && rng->valueType() == valueType()){
221  _range.reset(static_cast<ItemRange *>(rng));
222  }
223  }
224 
230  void setRange(const ItemRange& range)
231  {
232  if ( isReadOnly())
233  return;
234  changed(true);
235  if ( _childDomains.size() > 0) {
236  for(auto childid: _childDomains) {
237  IlwisData<ItemDomain<D>> childDom = mastercatalog()->get(childid.first) ;
238  if ( childDom.isValid()) {
239  if(!range.contains(childDom->_range)) {
240  WARN2(WARN_NOT_PART_OF2,"item range", TR("child domain"));
241  return;
242  }
243  }
244  }
245  }
246 
247  if ( parent().isValid()){
248  IDomain dm = parent();
249  IlwisData<ItemDomain<D>> itemdom = dm.get<ItemDomain<D>>();
250  if (!itemdom->_range->contains(range)){
251  WARN2(WARN_NOT_PART_OF2,"item range", TR("parent domain"));
252  return ;
253  }
254  }
255 
256  _range.reset(D::createRange());
257  _range->addRange(range);
258  }
259 
265  quint32 count() const {
266  if (_range.isNull()) {
267  ERROR1(ERR_NO_INITIALIZED_1, name());
268  return iUNDEF;
269  }
270  return _range->count();
271  }
272 
277  QString theme() const {
278  return _theme;
279  }
280 
285  void setTheme(const QString& theme) {
286  if ( isReadOnly())
287  return;
288  changed(true);
289  _theme = theme;
290  }
291 
299  void setParent(const IDomain& dm){
300  if ( isReadOnly())
301  return;
302  changed(true);
303  if ( !dm.isValid() && parent().isValid()){
304  // cut the relation with the parent; raws remain the same but no relation with parent any more;
305  IDomain dmp = parent();
306  IlwisData<ItemDomain<D>> dmparent = dmp.get<ItemDomain<D>>();
307  dmparent->removeChildDomain(id());
308  _range.reset(static_cast<ItemRange *>(_range->clone()));
309  Domain::setParent(dm);
310  return ;
311  }
312  if ( !hasType(dm->ilwisType(), itITEMDOMAIN) ) {
313  return;
314  }
315  if (!hasType(dm->valueType(), valueType())) {
316  return;
317  }
318  IlwisData<ItemDomain<D>> dmitem = dm.get<ItemDomain<D>>();
319  if ( theme() != dmitem->theme())
320  return;
321 
322  bool ok = _range->alignWithParent(dm);
323  if (!ok)
324  return ;
325 
326  Domain::setParent(dm);
327 
328  }
329 
330  //@override
331  IlwisTypes ilwisType() const {
332  return itITEMDOMAIN;
333  }
334 
335  //@override
336  IlwisTypes valueType() const {
337  return D::valueTypeS();
338  }
339 
346  return ItemIterator<D>(*this);
347  }
348 
355  return ItemIterator<D>(*this, count());
356  }
357 
363  bool isValid() const {
364  return !_range.isNull();
365  }
366 
367 protected:
368  SPRange getRange() const{
369  return _range.dynamicCast<Range>();
370  }
371 
372 private:
373  bool considerParent() const{
374  return !parent().isValid();
375  }
376 
377  SPItemRange _range;
378  QString _theme = sUNDEF;
379 };
380 
381 template<typename T> Ilwis::ItemIterator<T> begin(const Ilwis::IlwisData<Ilwis::ItemDomain<T>>& idom) {
382  return idom->begin();
383 }
384 
385 template<typename T> Ilwis::ItemIterator<T> end(const Ilwis::IlwisData<Ilwis::ItemDomain<T>>& idom) {
386  return idom->end();
387 }
388 
389 class ThematicItem;
390 class IndexedIdentifier;
391 class NamedIdentifier;
392 class NumericItem;
393 
394 typedef IlwisData<ItemDomain<ThematicItem>> IThematicDomain ;
395 typedef IlwisData<ItemDomain<IndexedIdentifier>> IIndexedIdDomain ;
396 typedef IlwisData<ItemDomain<NamedIdentifier>> INamedIdDomain ;
397 typedef IlwisData<ItemDomain<NumericItem>> INumericItemDomain ;
398 typedef ItemDomain<ThematicItem> ThematicDomain ;
399 typedef ItemDomain<IndexedIdentifier> IndexedIdDomain ;
400 typedef ItemDomain<NamedIdentifier> NamedIdDomain ;
401 typedef ItemDomain<NumericItem> NumericItemDomain ;
402 
403 }
404 
405 
406 
407 #endif // ITEMDOMAIN_H