libzypp  17.31.31
headervaluemap.cc
Go to the documentation of this file.
1 #include "headervaluemap.h"
2 #include <zypp-core/base/String.h>
3 
4 namespace zyppng {
5 
7 
9  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>() )
10  {}
11 
13  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>( *other._val ) )
14  {}
15 
17  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>( std::move(*other._val) ) )
18  {}
19 
20  HeaderValue::HeaderValue( const bool val )
21  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>(val) )
22  {}
23 
24  HeaderValue::HeaderValue( const int32_t val )
25  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>(val) )
26  {}
27 
28  HeaderValue::HeaderValue( const int64_t val )
29  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>(val) )
30  {}
31 
32  HeaderValue::HeaderValue( const double val )
33  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>(val) )
34  {}
35 
36  HeaderValue::HeaderValue( const std::string &val )
37  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>(val) )
38  {}
39 
40  HeaderValue::HeaderValue(const char *val)
41  : HeaderValue( zypp::str::asString (val) )
42  {}
43 
44  HeaderValue::HeaderValue( std::string &&val )
45  : _val ( new std::variant<std::monostate, std::string, int32_t, int64_t, double, bool>( std::move(val) ) )
46  {}
47 
48  bool HeaderValue::valid() const
49  {
50  return ( _val->index () > 0 );
51  }
52 
53  bool HeaderValue::isString() const
54  {
55  return std::holds_alternative<std::string>(*_val);
56  }
57 
58  bool HeaderValue::isInt() const
59  {
60  return std::holds_alternative<int32_t>(*_val);
61  }
62 
63  bool HeaderValue::isInt64() const
64  {
65  return std::holds_alternative<int64_t>(*_val);
66  }
67 
68  bool HeaderValue::isDouble() const
69  {
70  return std::holds_alternative<double>(*_val);
71  }
72 
73  bool HeaderValue::isBool() const
74  {
75  return std::holds_alternative<bool>(*_val);
76  }
77 
78  const std::string &HeaderValue::asString() const
79  {
80  return std::get<std::string>(*_val);
81  }
82 
83  int32_t HeaderValue::asInt() const
84  {
85  return std::get<int32_t>(*_val);
86  }
87 
88  int64_t HeaderValue::asInt64() const
89  {
90  if ( std::holds_alternative<int32_t>(*_val) )
91  return std::get<int32_t>( *_val );
92  return std::get<int64_t>(*_val);
93  }
94 
95  double HeaderValue::asDouble() const
96  {
97  return std::get<double>(*_val);
98  }
99 
100  bool HeaderValue::asBool() const
101  {
102  return std::get<bool>(*_val);
103  }
104 
106  {
107  return *_val;
108  }
109 
111  {
112  return *_val;
113  }
114 
116  {
117  *_val = *other._val;
118  return *this;
119  }
120 
121  bool HeaderValue::operator==(const HeaderValue &other) const
122  {
123  return ( *_val == *other._val );
124  }
125 
127  {
128  *_val = std::move( *other._val );
129  return *this;
130  }
131 
132  HeaderValue &HeaderValue::operator= ( const std::string &val )
133  {
134  *_val = val;
135  return *this;
136  }
137 
139  {
140  *_val = val;
141  return *this;
142  }
143 
145  {
146  *_val = val;
147  return *this;
148  }
149 
151  {
152  *_val = val;
153  return *this;
154  }
155 
157  {
158  *_val = val;
159  return *this;
160  }
161 
162 
163  HeaderValueMap::HeaderValueMap( std::initializer_list<HeaderValueMap::ValueMap::value_type> init )
164  : _values( std::move(init) )
165  { }
166 
167  bool HeaderValueMap::contains(const std::string &key) const
168  {
169  return _values.count (key) > 0 && _values.at(key).size () > 0 ;
170  }
171 
172  void HeaderValueMap::set( const std::string &key, const Value &val )
173  {
174  auto i = _values.find (key);
175  if ( i == _values.end() ) {
176  _values.insert ( std::make_pair(key, std::vector<Value>{val}) );
177  } else {
178  i->second = std::vector<Value>{val};
179  }
180  }
181 
182  void HeaderValueMap::set(const std::string &key, Value &&val)
183  {
184  auto i = _values.find (key);
185  if ( i == _values.end() ) {
186  _values.insert ( std::make_pair(key, std::vector<Value>{std::move(val)}) );
187  } else {
188  i->second = std::vector<Value>{std::move(val)};
189  }
190  }
191 
192  void HeaderValueMap::add(const std::string &key, const Value &val)
193  {
194  auto i = _values.find (key);
195  if ( i == _values.end() ) {
196  _values.insert ( std::make_pair(key, std::vector<Value>{val}) );
197  } else {
198  i->second.push_back(val);
199  }
200  }
201 
203  {
204  _values.clear();
205  }
206 
208  {
209  return _values.size();
210  }
211 
212  std::vector<HeaderValueMap::Value> &HeaderValueMap::values(const std::string &key)
213  {
214  return _values[key];
215  }
216 
217  const std::vector<HeaderValueMap::Value> &HeaderValueMap::values(const std::string &key) const
218  {
219  return _values.at(key);
220  }
221 
222  HeaderValueMap::Value HeaderValueMap::value ( const std::string_view &str, const HeaderValueMap::Value &defaultVal) const
223  { return value( std::string(str), defaultVal ); }
224 
225  HeaderValueMap::Value HeaderValueMap::value ( const std::string &str, const HeaderValueMap::Value &defaultVal) const
226  {
227  if ( !contains(str) || !_values.at(str).size() )
228  return defaultVal;
229  return _values.at(str).back();
230  }
231 
233  {
234  if ( !contains(key) )
235  return InvalidValue;
236  return _values[key].back();
237  }
238 
239  HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string_view &key )
240  {
241  return (*this)[std::string(key)];
242  }
243 
244  const HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string &key ) const
245  {
246  if ( !contains(key) )
247  return InvalidValue;
248  return _values.at(key).back();
249  }
250 
251  const HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string_view &key ) const
252  {
253  return (*this)[std::string(key)];
254  }
255 
257  {
258  auto yi = _values.erase(i.base());
260  }
261 
262  bool HeaderValueMap::erase(const std::string &key)
263  {
264  return ( _values.erase(key) > 0 );
265  }
266 
267 }
bool operator==(const HeaderValue &other) const
void add(const std::string &key, const Value &val)
std::variant< std::monostate, std::string, int32_t, int64_t, double, bool > value_type
const std::string & asString() const
bool isDouble() const
ValueMap::size_type size() const noexcept
HeaderValue & operator=(const HeaderValue &other)
String related utilities and Regular expression matching.
zypp::RWCOW_pointer< value_type > _val
Definition: Arch.h:363
void set(const std::string &key, const Value &val)
bool isString() const
int64_t asInt64() const
const_iterator erase(const const_iterator &i)
std::vector< Value > & values(const std::string &key)
Value value(const std::string_view &str, const Value &defaultVal=Value()) const
std::string asString(TInt val, char zero='0', char one='1')
For printing bits.
Definition: Bit.h:57
SolvableIdType size_type
Definition: PoolMember.h:126
static Value InvalidValue
value_type & asVariant()
bool isInt64() const
int32_t asInt() const
Value & operator[](const std::string &key)
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
double asDouble() const
bool contains(const std::string &key) const