22 #ifndef ASTSHIM_KEYMAP_H 23 #define ASTSHIM_KEYMAP_H 37 void throwKeyNotFound(std::string
const &key) {
40 std::ostringstream os;
41 os <<
"Key \"" << key <<
"\" not found or has an undefined value";
42 throw std::runtime_error(os.str());
93 explicit KeyMap(std::string
const &options =
"")
94 :
Object(reinterpret_cast<AstObject *>(astKeyMap(
"%s", options.c_str()))) {}
105 std::shared_ptr<KeyMap>
copy()
const {
116 bool ret =
static_cast<bool>(
117 astMapDefined(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
123 std::string
key(
int ind)
const {
124 int const len =
size();
125 if ((ind < 0) || (ind >= len)) {
126 std::ostringstream os;
127 os <<
"ind = " << ind <<
" not in range [0, " << len - 1 <<
"]";
128 throw std::invalid_argument(os.str());
130 const char *rawKey = astMapKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), ind);
132 return std::string(rawKey);
141 bool ret =
static_cast<bool>(
142 astMapHasKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
149 int len = astMapLength(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
156 int const size = astMapSize(reinterpret_cast<AstKeyMap const *>(
getRawPtr()));
162 double getD(std::string
const &
key,
int ind)
const {
164 if (!astMapGetElemD(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
165 throwKeyNotFound(key);
172 std::vector<double>
getD(std::string
const &
key)
const {
174 std::vector<double> retVec(size);
177 astMapGet1D(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
185 float getF(std::string
const &
key,
int ind)
const {
187 if (!astMapGetElemF(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
188 throwKeyNotFound(key);
195 std::vector<float>
getF(std::string
const &
key)
const {
197 std::vector<float> retVec(size);
200 astMapGet1F(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
208 int getI(std::string
const &
key,
int ind)
const {
210 if (!astMapGetElemI(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
211 throwKeyNotFound(key);
218 std::vector<int>
getI(std::string
const &
key)
const {
220 std::vector<int> retVec(size);
223 astMapGet1I(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
231 short int getS(std::string
const &
key,
int ind)
const {
233 if (!astMapGetElemS(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
234 throwKeyNotFound(key);
241 std::vector<short int>
getS(std::string
const &
key)
const {
243 std::vector<short int> retVec(size);
246 astMapGet1S(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
254 char unsigned getB(std::string
const &
key,
int ind)
const {
255 char unsigned retVal;
256 if (!astMapGetElemB(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
257 throwKeyNotFound(key);
264 std::vector<char unsigned>
getB(std::string
const &
key)
const {
266 std::vector<char unsigned> retVec(size);
269 astMapGet1B(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
277 std::string
getC(std::string
const &
key,
int ind)
const {
278 int const maxChar = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
279 std::unique_ptr<char[]> cstr(
new char[maxChar]);
280 if (!astMapGetElemC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), maxChar, ind,
282 throwKeyNotFound(key);
285 return std::string(cstr.get());
289 std::vector<std::string>
getC(std::string
const &
key)
const {
291 std::vector<std::string> retVec;
294 int const eltLen = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
295 std::unique_ptr<char[]> cstr(
new char[size * eltLen]);
297 astMapGet1C(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), eltLen,
size, &nret,
299 for (
int i = 0; i <
size; ++i) {
300 retVec.push_back(std::string(cstr.get() + i * eltLen));
308 std::shared_ptr<Object>
getA(std::string
const &
key,
int ind)
const {
309 std::shared_ptr<Object> retVal;
311 if (!astMapGetElemA(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &rawObj)) {
312 throwKeyNotFound(key);
315 return Object::fromAstObject<Object>(rawObj,
true);
319 std::vector<std::shared_ptr<Object>>
getA(std::string
const &
key)
const {
321 std::vector<std::shared_ptr<Object>> retVec;
322 for (
int i = 0; i <
size; ++i) {
323 retVec.push_back(
getA(key, i));
329 void putD(std::string
const &
key,
double value, std::string
const &comment =
"") {
330 astMapPut0D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
335 void putD(std::string
const &
key, std::vector<double>
const &vec, std::string
const &comment =
"") {
336 _assertVectorNotEmpty(key, vec.size());
337 astMapPut1D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
343 void putF(std::string
const &
key,
float value, std::string
const &comment =
"") {
344 astMapPut0F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
349 void putF(std::string
const &
key, std::vector<float>
const &vec, std::string
const &comment =
"") {
350 _assertVectorNotEmpty(key, vec.size());
351 astMapPut1F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
357 void putI(std::string
const &
key,
int value, std::string
const &comment =
"") {
358 astMapPut0I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
363 void putI(std::string
const &
key, std::vector<int>
const &vec, std::string
const &comment =
"") {
364 _assertVectorNotEmpty(key, vec.size());
365 astMapPut1I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
371 void putS(std::string
const &
key,
short int value, std::string
const &comment =
"") {
372 astMapPut0S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
377 void putS(std::string
const &
key, std::vector<short int>
const &vec, std::string
const &comment =
"") {
378 _assertVectorNotEmpty(key, vec.size());
379 astMapPut1S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
385 void putB(std::string
const &
key,
char unsigned value, std::string
const &comment =
"") {
386 astMapPut0B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
391 void putB(std::string
const &
key, std::vector<char unsigned>
const &vec,
392 std::string
const &comment =
"") {
393 _assertVectorNotEmpty(key, vec.size());
394 astMapPut1B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
400 void putC(std::string
const &
key, std::string
const &value, std::string
const &comment =
"") {
401 astMapPut0C(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value.c_str(), comment.c_str());
406 void putC(std::string
const &
key, std::vector<std::string>
const &vec, std::string
const &comment =
"") {
407 _assertVectorNotEmpty(key, vec.size());
409 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
419 void putA(std::string
const &
key,
Object const &obj, std::string
const &comment =
"") {
420 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(obj.
getRawPtr()));
421 astMapPut0A(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), rawCopy, comment.c_str());
426 void putA(std::string
const &
key, std::vector<std::shared_ptr<Object const>>
const &vec,
427 std::string
const &comment =
"") {
428 _assertVectorNotEmpty(key, vec.size());
430 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
446 void putU(std::string
const &
key, std::string
const &comment =
"") {
447 astMapPutU(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), comment.c_str());
453 int const i = _getAppendIndex(key);
454 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
460 int const i = _getAppendIndex(key);
461 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
467 int const i = _getAppendIndex(key);
468 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
474 int const i = _getAppendIndex(key);
475 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
480 void append(std::string
const &
key,
char unsigned value) {
481 int const i = _getAppendIndex(key);
482 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
487 void append(std::string
const &
key, std::string
const &value) {
488 int const i = _getAppendIndex(key);
489 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
495 int const i = _getAppendIndex(key);
496 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
497 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
503 _assertReplaceIndexInRange(key, i);
504 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
510 _assertReplaceIndexInRange(key, i);
511 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
517 _assertReplaceIndexInRange(key, i);
518 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
523 void replace(std::string
const &
key,
int i,
short int value) {
524 _assertReplaceIndexInRange(key, i);
525 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
530 void replace(std::string
const &
key,
int i,
char unsigned value) {
531 _assertReplaceIndexInRange(key, i);
532 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
537 void replace(std::string
const &
key,
int i, std::string
const &value) {
538 _assertReplaceIndexInRange(key, i);
539 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
545 _assertReplaceIndexInRange(key, i);
546 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
547 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
556 void remove(std::string
const &
key) {
557 astMapRemove(reinterpret_cast<AstKeyMap *>(
getRawPtr()),
key.c_str());
566 void rename(std::string
const &oldKey, std::string
const &newKey) {
567 astMapRename(reinterpret_cast<AstKeyMap *>(
getRawPtr()), oldKey.c_str(), newKey.c_str());
575 int retVal = astMapType(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str());
577 return static_cast<DataType>(retVal);
583 return std::static_pointer_cast<
KeyMap>(copyImpl<KeyMap, AstKeyMap>());
589 explicit KeyMap(AstKeyMap *rawKeyMap) :
Object(reinterpret_cast<AstObject *>(rawKeyMap)) {
591 std::ostringstream os;
592 os <<
"this is a " <<
getClassName() <<
", which is not a KeyMap";
593 throw std::invalid_argument(os.str());
599 void _assertVectorNotEmpty(std::string
const &
key,
int size)
const {
601 std::ostringstream os;
602 os <<
"vector supplied for key \"" << key <<
"\" has zero elements";
603 throw std::invalid_argument(os.str());
608 void _assertReplaceIndexInRange(std::string
const &key,
int i)
const {
609 int const len =
length(key);
610 if ((i < 0) || (i >= len)) {
611 std::ostringstream os;
612 os <<
"i = " << i <<
" not in range [0, " << len - 1 <<
"] for key \"" << key <<
"\"";
613 throw std::invalid_argument(os.str());
618 int _getAppendIndex(std::string
const &key)
const {
619 int const i =
length(key);
621 std::ostringstream os;
622 os <<
"key \"" << key <<
"\" not found";
623 throw std::invalid_argument(os.str());
void rename(std::string const &oldKey, std::string const &newKey)
Definition: KeyMap.h:566
void append(std::string const &key, short int value)
Append an element to a vector of short int in a KeyMap.
Definition: KeyMap.h:473
void replace(std::string const &key, int i, int value)
Replace an element of a vector of ints in a KeyMap.
Definition: KeyMap.h:516
void putI(std::string const &key, std::vector< int > const &vec, std::string const &comment="")
Add a vector of ints.
Definition: KeyMap.h:363
int getI(std::string const &key, int ind) const
Get one int value for a given key.
Definition: KeyMap.h:208
void putU(std::string const &key, std::string const &comment="")
Definition: KeyMap.h:446
short int getS(std::string const &key, int ind) const
Get one short int value for a given key.
Definition: KeyMap.h:231
AstObject const * getRawPtr() const
Definition: Object.h:291
KeyMap(std::string const &options="")
Definition: KeyMap.h:93
AST wrapper classes and functions.
Definition: attributes_channel.dox:1
void replace(std::string const &key, int i, std::string const &value)
Replace an element of a vector of strings in a KeyMap.
Definition: KeyMap.h:537
virtual std::shared_ptr< Object > copyPolymorphic() const override
Definition: KeyMap.h:582
void putB(std::string const &key, std::vector< char unsigned > const &vec, std::string const &comment="")
Add a vector of chars.
Definition: KeyMap.h:391
std::string getClassName() const
Definition: Object.h:138
void putC(std::string const &key, std::vector< std::string > const &vec, std::string const &comment="")
Add a vector of strings.
Definition: KeyMap.h:406
bool defined(std::string const &key) const
Definition: KeyMap.h:115
void assertOK(AstObject *rawPtr1=nullptr, AstObject *rawPtr2=nullptr)
Definition: base.cc:49
std::vector< std::string > getC(std::string const &key) const
Get all std::string values for a given key.
Definition: KeyMap.h:289
void putI(std::string const &key, int value, std::string const &comment="")
Add an int.
Definition: KeyMap.h:357
double getD(std::string const &key, int ind) const
Get one double value for a given key.
Definition: KeyMap.h:162
void replace(std::string const &key, int i, short int value)
Replace an element of a vector of short int in a KeyMap.
Definition: KeyMap.h:523
int length(std::string const &key) const
Get the size of the vector for the specified key; return 0 if key not found or value is undefined...
Definition: KeyMap.h:148
int size() const
Get the number of keys.
Definition: KeyMap.h:155
void putF(std::string const &key, std::vector< float > const &vec, std::string const &comment="")
Add a vector of floats.
Definition: KeyMap.h:349
std::vector< float > getF(std::string const &key) const
Get all float values for a given key.
Definition: KeyMap.h:195
void append(std::string const &key, float value)
Append an element to a vector of floats in a KeyMap.
Definition: KeyMap.h:459
void replace(std::string const &key, int i, double value)
Replace an element of a vector of doubles in a KeyMap.
Definition: KeyMap.h:502
std::string getC(std::string const &key, int ind) const
Get one std::string value for a given key.
Definition: KeyMap.h:277
std::vector< double > getD(std::string const &key) const
Get all double values for a given key.
Definition: KeyMap.h:172
void replace(std::string const &key, int i, float value)
Replace an element of a vector of floats in a KeyMap.
Definition: KeyMap.h:509
std::vector< short int > getS(std::string const &key) const
Get all short int values for a given key.
Definition: KeyMap.h:241
void append(std::string const &key, int value)
Append an element to a vector of ints in a KeyMap.
Definition: KeyMap.h:466
void putS(std::string const &key, short int value, std::string const &comment="")
Add a short int.
Definition: KeyMap.h:371
void append(std::string const &key, double value)
Append an element to a vector of doubles in a KeyMap.
Definition: KeyMap.h:452
void putB(std::string const &key, char unsigned value, std::string const &comment="")
Add a char.
Definition: KeyMap.h:385
void append(std::string const &key, std::string const &value)
Append an element to a vector of strings in a KeyMap.
Definition: KeyMap.h:487
void append(std::string const &key, char unsigned value)
Append an element to a vector of char in a KeyMap.
Definition: KeyMap.h:480
bool hasKey(std::string const &key) const
Definition: KeyMap.h:140
void replace(std::string const &key, int i, char unsigned value)
Replace an element of a vector of char in a KeyMap.
Definition: KeyMap.h:530
virtual ~KeyMap()
Definition: KeyMap.h:96
void putD(std::string const &key, std::vector< double > const &vec, std::string const &comment="")
Add a vector of double.
Definition: KeyMap.h:335
void replace(std::string const &key, int i, Object const &value)
Replace an element of a vector of Objects in a KeyMap.
Definition: KeyMap.h:544
void putS(std::string const &key, std::vector< short int > const &vec, std::string const &comment="")
Add a vector of short int.
Definition: KeyMap.h:377
std::shared_ptr< KeyMap > copy() const
Return a deep copy of this object.
Definition: KeyMap.h:105
void putF(std::string const &key, float value, std::string const &comment="")
Add a float.
Definition: KeyMap.h:343
char unsigned getB(std::string const &key, int ind) const
Get one char value for a given key.
Definition: KeyMap.h:254
KeyMap & operator=(KeyMap const &)=delete
std::vector< char unsigned > getB(std::string const &key) const
Get all char values for a given key.
Definition: KeyMap.h:264
DataType
Definition: base.h:62
std::string key(int ind) const
Get the key at the specified index.
Definition: KeyMap.h:123
float getF(std::string const &key, int ind) const
Get one float value for a given key.
Definition: KeyMap.h:185
std::shared_ptr< Object > getA(std::string const &key, int ind) const
Get one Object for a given key; the object is deep copied.
Definition: KeyMap.h:308
std::vector< std::shared_ptr< Object > > getA(std::string const &key) const
Get all Objects for a given key; each object is deep copied.
Definition: KeyMap.h:319
void putC(std::string const &key, std::string const &value, std::string const &comment="")
Add a string.
Definition: KeyMap.h:400
void putA(std::string const &key, Object const &obj, std::string const &comment="")
Add an Object, which is deep copied.
Definition: KeyMap.h:419
void append(std::string const &key, Object const &value)
Append an element to a vector of Objects in a KeyMap.
Definition: KeyMap.h:494
KeyMap(AstKeyMap *rawKeyMap)
Definition: KeyMap.h:589
DataType type(std::string const &key)
Definition: KeyMap.h:574
void putA(std::string const &key, std::vector< std::shared_ptr< Object const >> const &vec, std::string const &comment="")
Add a vector of shared pointer to Object; the objects are deep copied.
Definition: KeyMap.h:426
void putD(std::string const &key, double value, std::string const &comment="")
Add a double value.
Definition: KeyMap.h:329
std::vector< int > getI(std::string const &key) const
Get all int values for a given key.
Definition: KeyMap.h:218