File: properties_map.cpp

package info (click to toggle)
indigo 1.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 28,256 kB
  • sloc: ansic: 309,316; cpp: 137,636; cs: 9,118; asm: 8,011; java: 7,195; sql: 6,697; xml: 4,352; python: 3,426; sh: 207; php: 56; makefile: 49
file content (121 lines) | stat: -rw-r--r-- 3,265 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/****************************************************************************
 * Copyright (C) 2009-2015 EPAM Systems
 * 
 * This file is part of Indigo toolkit.
 * 
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 3 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
 * 
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 ***************************************************************************/

#include "base_cpp/properties_map.h"

using namespace indigo;

IMPL_ERROR(PropertiesMap, "properties map");

void PropertiesMap::copy(RedBlackStringObjMap< Array<char> > &other) {
   clear();
   for (int i = other.begin(); i != other.end(); i = other.next(i)) {
      insert(other.key(i), other.value(i).ptr());
   }
}
void PropertiesMap::copy(PropertiesMap& other) {
   clear();
   for(auto p : other.elements()) {
      insert(other.key(p), other.value(p));
   }
}
void PropertiesMap::insert(const char* key, const char* value) {
   int res;
   if (_properties.find(key)) {
      auto& val = _properties.at(key);
      if (value != 0)
         val.readString(value, true);
   } else {
      auto& name = _propertyNames.push();
      name.readString(key, true);
      int k = _properties.insert(key);
      if (value != 0)
         _properties.value(k).readString(value, true);
   }
}
Array<char>& PropertiesMap::insert(const char* key){
   insert (key, 0); 
   return valueBuf(key);
}
const char* PropertiesMap::key(int i) {
   return _propertyNames.at(i).ptr();
}

const char* PropertiesMap::value(int i) {
   auto& buf = valueBuf(_propertyNames.at(i).ptr());
   if(buf.size() > 0) {
      return buf.ptr();
   } else {
      return "";
   }
}

Array<char>& PropertiesMap::valueBuf(const char* key) {
   return _properties.at(key);
}

void PropertiesMap::clear() {
   _properties.clear();
   _propertyNames.clear();
}

bool PropertiesMap::contains(const char* key) {
   return _properties.find(key);
}

const char* PropertiesMap::at(const char* key) {
   return _properties.at(key).ptr();
}

void PropertiesMap::remove(const char* key) {
   if(_properties.find(key)) {
      _properties.remove(key);
      int to_remove = -1;
      for (auto i =0; i < _propertyNames.size(); i++) {
         if(strcmp(_propertyNames.at(i).ptr(), key) == 0) {
            to_remove = i;
            break;
         }
      }
      if(to_remove >= 0) {
         _propertyNames.remove(to_remove);
      } else {
         throw Error("internal error with properties");
      }
   }
}

PropertiesMap::PrAuto PropertiesMap::elements() {
   return PrAuto(*this);
}


PropertiesMap::PrIter::PrIter(PropertiesMap &owner, int idx): _owner(owner), AutoIterator(idx) {
}

PropertiesMap::PrIter & PropertiesMap::PrIter::operator++(){
   _idx += 1;
   return *this;
}

PropertiesMap::PrIter PropertiesMap::PrAuto::begin(){
   return PropertiesMap::PrIter(_owner, 0);
}

int PropertiesMap::PrAuto::next(int k) {
   return k+1;
}
PropertiesMap::PrIter PropertiesMap::PrAuto::end(){
   return PropertiesMap::PrIter(_owner, _owner._propertyNames.size());
}