22 #ifndef ASTSHIM_KEYMAP_H 23 #define ASTSHIM_KEYMAP_H 28 #include "astshim/base.h" 29 #include "astshim/Channel.h" 30 #include "astshim/Object.h" 36 void throwKeyNotFound(std::string
const &key) {
39 std::ostringstream os;
40 os <<
"Key \"" << key <<
"\" not found or has an undefined value";
41 throw std::runtime_error(os.str());
92 explicit KeyMap(std::string
const &options =
"")
93 :
Object(reinterpret_cast<AstObject *>(astKeyMap(
"%s", options.c_str()))) {}
104 std::shared_ptr<KeyMap>
copy()
const {
115 bool ret =
static_cast<bool>(
116 astMapDefined(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
122 std::string
key(
int ind)
const {
123 int const len =
size();
124 if ((ind < 0) || (ind >= len)) {
125 std::ostringstream os;
126 os <<
"ind = " << ind <<
" not in range [0, " << len - 1 <<
"]";
127 throw std::invalid_argument(os.str());
129 const char *rawKey = astMapKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), ind);
131 return std::string(rawKey);
140 bool ret =
static_cast<bool>(
141 astMapHasKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
148 int len = astMapLength(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
155 int const size = astMapSize(reinterpret_cast<AstKeyMap const *>(
getRawPtr()));
161 double getD(std::string
const &
key,
int ind)
const {
163 if (!astMapGetElemD(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
164 throwKeyNotFound(key);
171 std::vector<double>
getD(std::string
const &
key)
const {
173 std::vector<double> retVec(size);
176 astMapGet1D(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
184 float getF(std::string
const &
key,
int ind)
const {
186 if (!astMapGetElemF(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
187 throwKeyNotFound(key);
194 std::vector<float>
getF(std::string
const &
key)
const {
196 std::vector<float> retVec(size);
199 astMapGet1F(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
207 int getI(std::string
const &
key,
int ind)
const {
209 if (!astMapGetElemI(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
210 throwKeyNotFound(key);
217 std::vector<int>
getI(std::string
const &
key)
const {
219 std::vector<int> retVec(size);
222 astMapGet1I(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
230 short int getS(std::string
const &
key,
int ind)
const {
232 if (!astMapGetElemS(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
233 throwKeyNotFound(key);
240 std::vector<short int>
getS(std::string
const &
key)
const {
242 std::vector<short int> retVec(size);
245 astMapGet1S(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
253 char unsigned getB(std::string
const &
key,
int ind)
const {
254 char unsigned retVal;
255 if (!astMapGetElemB(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
256 throwKeyNotFound(key);
263 std::vector<char unsigned>
getB(std::string
const &
key)
const {
265 std::vector<char unsigned> retVec(size);
268 astMapGet1B(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
276 std::string
getC(std::string
const &
key,
int ind)
const {
277 int const maxChar = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
278 char charArr[maxChar];
279 if (!astMapGetElemC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), maxChar, ind,
281 throwKeyNotFound(key);
284 return std::string(charArr);
288 std::vector<std::string>
getC(std::string
const &
key)
const {
290 std::vector<std::string> retVec;
293 int const eltLen = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
294 char charArr[size * eltLen];
296 astMapGet1C(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), eltLen,
size, &nret,
298 for (
int i = 0; i <
size; ++i) {
299 retVec.push_back(std::string(charArr + i * eltLen));
307 std::shared_ptr<Object>
getA(std::string
const &
key,
int ind)
const {
308 std::shared_ptr<Object> retVal;
310 if (!astMapGetElemA(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &rawObj)) {
311 throwKeyNotFound(key);
314 return Object::fromAstObject<Object>(rawObj,
true);
318 std::vector<std::shared_ptr<Object>>
getA(std::string
const &
key)
const {
320 std::vector<std::shared_ptr<Object>> retVec;
321 for (
int i = 0; i <
size; ++i) {
322 retVec.push_back(
getA(key, i));
328 void putD(std::string
const &
key,
double value, std::string
const &comment =
"") {
329 astMapPut0D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
334 void putD(std::string
const &
key, std::vector<double>
const &vec, std::string
const &comment =
"") {
335 _assertVectorNotEmpty(key, vec.size());
336 astMapPut1D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
342 void putF(std::string
const &
key,
float value, std::string
const &comment =
"") {
343 astMapPut0F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
348 void putF(std::string
const &
key, std::vector<float>
const &vec, std::string
const &comment =
"") {
349 _assertVectorNotEmpty(key, vec.size());
350 astMapPut1F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
356 void putI(std::string
const &
key,
int value, std::string
const &comment =
"") {
357 astMapPut0I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
362 void putI(std::string
const &
key, std::vector<int>
const &vec, std::string
const &comment =
"") {
363 _assertVectorNotEmpty(key, vec.size());
364 astMapPut1I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
370 void putS(std::string
const &
key,
short int value, std::string
const &comment =
"") {
371 astMapPut0S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
376 void putS(std::string
const &
key, std::vector<short int>
const &vec, std::string
const &comment =
"") {
377 _assertVectorNotEmpty(key, vec.size());
378 astMapPut1S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
384 void putB(std::string
const &
key,
char unsigned value, std::string
const &comment =
"") {
385 astMapPut0B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
390 void putB(std::string
const &
key, std::vector<char unsigned>
const &vec,
391 std::string
const &comment =
"") {
392 _assertVectorNotEmpty(key, vec.size());
393 astMapPut1B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
399 void putC(std::string
const &
key, std::string
const &value, std::string
const &comment =
"") {
400 astMapPut0C(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value.c_str(), comment.c_str());
405 void putC(std::string
const &
key, std::vector<std::string>
const &vec, std::string
const &comment =
"") {
406 _assertVectorNotEmpty(key, vec.size());
408 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
418 void putA(std::string
const &
key,
Object const &obj, std::string
const &comment =
"") {
419 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(obj.
getRawPtr()));
420 astMapPut0A(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), rawCopy, comment.c_str());
425 void putA(std::string
const &
key, std::vector<std::shared_ptr<Object const>>
const &vec,
426 std::string
const &comment =
"") {
427 _assertVectorNotEmpty(key, vec.size());
429 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
445 void putU(std::string
const &
key, std::string
const &comment =
"") {
446 astMapPutU(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), comment.c_str());
452 int const i = _getAppendIndex(key);
453 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
459 int const i = _getAppendIndex(key);
460 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
466 int const i = _getAppendIndex(key);
467 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
473 int const i = _getAppendIndex(key);
474 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
479 void append(std::string
const &
key,
char unsigned value) {
480 int const i = _getAppendIndex(key);
481 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
486 void append(std::string
const &
key, std::string
const &value) {
487 int const i = _getAppendIndex(key);
488 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
494 int const i = _getAppendIndex(key);
495 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
496 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
502 _assertReplaceIndexInRange(key, i);
503 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
509 _assertReplaceIndexInRange(key, i);
510 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
516 _assertReplaceIndexInRange(key, i);
517 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
522 void replace(std::string
const &
key,
int i,
short int value) {
523 _assertReplaceIndexInRange(key, i);
524 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
529 void replace(std::string
const &
key,
int i,
char unsigned value) {
530 _assertReplaceIndexInRange(key, i);
531 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
536 void replace(std::string
const &
key,
int i, std::string
const &value) {
537 _assertReplaceIndexInRange(key, i);
538 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
544 _assertReplaceIndexInRange(key, i);
545 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
546 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
555 void remove(std::string
const &
key) {
556 astMapRemove(reinterpret_cast<AstKeyMap *>(
getRawPtr()),
key.c_str());
565 void rename(std::string
const &oldKey, std::string
const &newKey) {
566 astMapRename(reinterpret_cast<AstKeyMap *>(
getRawPtr()), oldKey.c_str(), newKey.c_str());
574 int retVal = astMapType(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str());
576 return static_cast<DataType>(retVal);
582 return std::static_pointer_cast<
KeyMap>(copyImpl<KeyMap, AstKeyMap>());
588 explicit KeyMap(AstKeyMap *rawKeyMap) :
Object(reinterpret_cast<AstObject *>(rawKeyMap)) {
590 std::ostringstream os;
591 os <<
"this is a " <<
getClassName() <<
", which is not a KeyMap";
592 throw std::invalid_argument(os.str());
598 void _assertVectorNotEmpty(std::string
const &
key,
int size)
const {
600 std::ostringstream os;
601 os <<
"vector supplied for key \"" << key <<
"\" has zero elements";
602 throw std::invalid_argument(os.str());
607 void _assertReplaceIndexInRange(std::string
const &key,
int i)
const {
608 int const len =
length(key);
609 if ((i < 0) || (i >= len)) {
610 std::ostringstream os;
611 os <<
"i = " << i <<
" not in range [0, " << len - 1 <<
"] for key \"" << key <<
"\"";
612 throw std::invalid_argument(os.str());
617 int _getAppendIndex(std::string
const &key)
const {
618 int const i =
length(key);
620 std::ostringstream os;
621 os <<
"key \"" << key <<
"\" not found";
622 throw std::invalid_argument(os.str());
void rename(std::string const &oldKey, std::string const &newKey)
Definition: KeyMap.h:565
void append(std::string const &key, short int value)
Append an element to a vector of short int in a KeyMap.
Definition: KeyMap.h:472
void replace(std::string const &key, int i, int value)
Replace an element of a vector of ints in a KeyMap.
Definition: KeyMap.h:515
void putI(std::string const &key, std::vector< int > const &vec, std::string const &comment="")
Add a vector of ints.
Definition: KeyMap.h:362
int getI(std::string const &key, int ind) const
Get one int value for a given key.
Definition: KeyMap.h:207
void putU(std::string const &key, std::string const &comment="")
Definition: KeyMap.h:445
short int getS(std::string const &key, int ind) const
Get one short int value for a given key.
Definition: KeyMap.h:230
AstObject const * getRawPtr() const
Definition: Object.h:291
KeyMap(std::string const &options="")
Definition: KeyMap.h:92
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:536
virtual std::shared_ptr< Object > copyPolymorphic() const override
Definition: KeyMap.h:581
void putB(std::string const &key, std::vector< char unsigned > const &vec, std::string const &comment="")
Add a vector of chars.
Definition: KeyMap.h:390
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:405
bool defined(std::string const &key) const
Definition: KeyMap.h:114
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:288
void putI(std::string const &key, int value, std::string const &comment="")
Add an int.
Definition: KeyMap.h:356
double getD(std::string const &key, int ind) const
Get one double value for a given key.
Definition: KeyMap.h:161
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:522
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:147
int size() const
Get the number of keys.
Definition: KeyMap.h:154
void putF(std::string const &key, std::vector< float > const &vec, std::string const &comment="")
Add a vector of floats.
Definition: KeyMap.h:348
std::vector< float > getF(std::string const &key) const
Get all float values for a given key.
Definition: KeyMap.h:194
void append(std::string const &key, float value)
Append an element to a vector of floats in a KeyMap.
Definition: KeyMap.h:458
void replace(std::string const &key, int i, double value)
Replace an element of a vector of doubles in a KeyMap.
Definition: KeyMap.h:501
std::string getC(std::string const &key, int ind) const
Get one std::string value for a given key.
Definition: KeyMap.h:276
std::vector< double > getD(std::string const &key) const
Get all double values for a given key.
Definition: KeyMap.h:171
void replace(std::string const &key, int i, float value)
Replace an element of a vector of floats in a KeyMap.
Definition: KeyMap.h:508
std::vector< short int > getS(std::string const &key) const
Get all short int values for a given key.
Definition: KeyMap.h:240
void append(std::string const &key, int value)
Append an element to a vector of ints in a KeyMap.
Definition: KeyMap.h:465
void putS(std::string const &key, short int value, std::string const &comment="")
Add a short int.
Definition: KeyMap.h:370
void append(std::string const &key, double value)
Append an element to a vector of doubles in a KeyMap.
Definition: KeyMap.h:451
void putB(std::string const &key, char unsigned value, std::string const &comment="")
Add a char.
Definition: KeyMap.h:384
void append(std::string const &key, std::string const &value)
Append an element to a vector of strings in a KeyMap.
Definition: KeyMap.h:486
void append(std::string const &key, char unsigned value)
Append an element to a vector of char in a KeyMap.
Definition: KeyMap.h:479
bool hasKey(std::string const &key) const
Definition: KeyMap.h:139
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:529
void putD(std::string const &key, std::vector< double > const &vec, std::string const &comment="")
Add a vector of double.
Definition: KeyMap.h:334
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:543
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:376
std::shared_ptr< KeyMap > copy() const
Return a deep copy of this object.
Definition: KeyMap.h:104
void putF(std::string const &key, float value, std::string const &comment="")
Add a float.
Definition: KeyMap.h:342
char unsigned getB(std::string const &key, int ind) const
Get one char value for a given key.
Definition: KeyMap.h:253
std::vector< char unsigned > getB(std::string const &key) const
Get all char values for a given key.
Definition: KeyMap.h:263
DataType
Definition: base.h:62
std::string key(int ind) const
Get the key at the specified index.
Definition: KeyMap.h:122
float getF(std::string const &key, int ind) const
Get one float value for a given key.
Definition: KeyMap.h:184
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:307
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:318
void putC(std::string const &key, std::string const &value, std::string const &comment="")
Add a string.
Definition: KeyMap.h:399
void putA(std::string const &key, Object const &obj, std::string const &comment="")
Add an Object, which is deep copied.
Definition: KeyMap.h:418
void append(std::string const &key, Object const &value)
Append an element to a vector of Objects in a KeyMap.
Definition: KeyMap.h:493
KeyMap(AstKeyMap *rawKeyMap)
Definition: KeyMap.h:588
DataType type(std::string const &key)
Definition: KeyMap.h:573
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:425
void putD(std::string const &key, double value, std::string const &comment="")
Add a double value.
Definition: KeyMap.h:328
std::vector< int > getI(std::string const &key) const
Get all int values for a given key.
Definition: KeyMap.h:217