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()))) {}
103 std::shared_ptr<KeyMap>
copy()
const {
114 bool ret =
static_cast<bool>(
115 astMapDefined(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
121 std::string
key(
int ind)
const {
122 int const len =
size();
123 if ((ind < 0) || (ind >= len)) {
124 std::ostringstream os;
125 os <<
"ind = " << ind <<
" not in range [0, " << len - 1 <<
"]";
126 throw std::invalid_argument(os.str());
128 const char *rawKey = astMapKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), ind);
130 return std::string(rawKey);
139 bool ret =
static_cast<bool>(
140 astMapHasKey(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str()));
147 int len = astMapLength(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
154 int const size = astMapSize(reinterpret_cast<AstKeyMap const *>(
getRawPtr()));
160 double getD(std::string
const &
key,
int ind)
const {
162 if (!astMapGetElemD(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
163 throwKeyNotFound(key);
170 std::vector<double>
getD(std::string
const &
key)
const {
172 std::vector<double> retVec(size);
175 astMapGet1D(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
183 float getF(std::string
const &
key,
int ind)
const {
185 if (!astMapGetElemF(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
186 throwKeyNotFound(key);
193 std::vector<float>
getF(std::string
const &
key)
const {
195 std::vector<float> retVec(size);
198 astMapGet1F(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
206 int getI(std::string
const &
key,
int ind)
const {
208 if (!astMapGetElemI(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
209 throwKeyNotFound(key);
216 std::vector<int>
getI(std::string
const &
key)
const {
218 std::vector<int> retVec(size);
221 astMapGet1I(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
229 short int getS(std::string
const &
key,
int ind)
const {
231 if (!astMapGetElemS(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
232 throwKeyNotFound(key);
239 std::vector<short int>
getS(std::string
const &
key)
const {
241 std::vector<short int> retVec(size);
244 astMapGet1S(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
252 char unsigned getB(std::string
const &
key,
int ind)
const {
253 char unsigned retVal;
254 if (!astMapGetElemB(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &retVal)) {
255 throwKeyNotFound(key);
262 std::vector<char unsigned>
getB(std::string
const &
key)
const {
264 std::vector<char unsigned> retVec(size);
267 astMapGet1B(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(),
size, &nret,
275 std::string
getC(std::string
const &
key,
int ind)
const {
276 int const maxChar = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
277 char charArr[maxChar];
278 if (!astMapGetElemC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), maxChar, ind,
280 throwKeyNotFound(key);
283 return std::string(charArr);
287 std::vector<std::string>
getC(std::string
const &
key)
const {
289 std::vector<std::string> retVec;
292 int const eltLen = 1 + astMapLenC(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str());
293 char charArr[size * eltLen];
295 astMapGet1C(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), eltLen,
size, &nret,
297 for (
int i = 0; i <
size; ++i) {
298 retVec.push_back(std::string(charArr + i * eltLen));
306 std::shared_ptr<Object>
getA(std::string
const &
key,
int ind)
const {
307 std::shared_ptr<Object> retVal;
309 if (!astMapGetElemA(reinterpret_cast<AstKeyMap const *>(
getRawPtr()), key.c_str(), ind, &rawObj)) {
310 throwKeyNotFound(key);
313 return Object::fromAstObject<Object>(rawObj,
true);
317 std::vector<std::shared_ptr<Object>>
getA(std::string
const &
key)
const {
319 std::vector<std::shared_ptr<Object>> retVec;
320 for (
int i = 0; i <
size; ++i) {
321 retVec.push_back(
getA(key, i));
327 void putD(std::string
const &
key,
double value, std::string
const &comment =
"") {
328 astMapPut0D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
333 void putD(std::string
const &
key, std::vector<double>
const &vec, std::string
const &comment =
"") {
334 _assertVectorNotEmpty(key, vec.size());
335 astMapPut1D(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
341 void putF(std::string
const &
key,
float value, std::string
const &comment =
"") {
342 astMapPut0F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
347 void putF(std::string
const &
key, std::vector<float>
const &vec, std::string
const &comment =
"") {
348 _assertVectorNotEmpty(key, vec.size());
349 astMapPut1F(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
355 void putI(std::string
const &
key,
int value, std::string
const &comment =
"") {
356 astMapPut0I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
361 void putI(std::string
const &
key, std::vector<int>
const &vec, std::string
const &comment =
"") {
362 _assertVectorNotEmpty(key, vec.size());
363 astMapPut1I(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
369 void putS(std::string
const &
key,
short int value, std::string
const &comment =
"") {
370 astMapPut0S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
375 void putS(std::string
const &
key, std::vector<short int>
const &vec, std::string
const &comment =
"") {
376 _assertVectorNotEmpty(key, vec.size());
377 astMapPut1S(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
383 void putB(std::string
const &
key,
char unsigned value, std::string
const &comment =
"") {
384 astMapPut0B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value, comment.c_str());
389 void putB(std::string
const &
key, std::vector<char unsigned>
const &vec,
390 std::string
const &comment =
"") {
391 _assertVectorNotEmpty(key, vec.size());
392 astMapPut1B(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), vec.size(), vec.data(),
398 void putC(std::string
const &
key, std::string
const &value, std::string
const &comment =
"") {
399 astMapPut0C(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), value.c_str(), comment.c_str());
404 void putC(std::string
const &
key, std::vector<std::string>
const &vec, std::string
const &comment =
"") {
405 _assertVectorNotEmpty(key, vec.size());
407 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
417 void putA(std::string
const &
key,
Object const &obj, std::string
const &comment =
"") {
418 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(obj.
getRawPtr()));
419 astMapPut0A(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), rawCopy, comment.c_str());
424 void putA(std::string
const &
key, std::vector<std::shared_ptr<Object const>>
const &vec,
425 std::string
const &comment =
"") {
426 _assertVectorNotEmpty(key, vec.size());
428 for (
int i = 0,
size = vec.size(); i <
size; ++i) {
444 void putU(std::string
const &
key, std::string
const &comment =
"") {
445 astMapPutU(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), comment.c_str());
451 int const i = _getAppendIndex(key);
452 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
458 int const i = _getAppendIndex(key);
459 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
465 int const i = _getAppendIndex(key);
466 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
472 int const i = _getAppendIndex(key);
473 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
478 void append(std::string
const &
key,
char unsigned value) {
479 int const i = _getAppendIndex(key);
480 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
485 void append(std::string
const &
key, std::string
const &value) {
486 int const i = _getAppendIndex(key);
487 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
493 int const i = _getAppendIndex(key);
494 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
495 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
501 _assertReplaceIndexInRange(key, i);
502 astMapPutElemD(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
508 _assertReplaceIndexInRange(key, i);
509 astMapPutElemF(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
515 _assertReplaceIndexInRange(key, i);
516 astMapPutElemI(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
521 void replace(std::string
const &
key,
int i,
short int value) {
522 _assertReplaceIndexInRange(key, i);
523 astMapPutElemS(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
528 void replace(std::string
const &
key,
int i,
char unsigned value) {
529 _assertReplaceIndexInRange(key, i);
530 astMapPutElemB(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value);
535 void replace(std::string
const &
key,
int i, std::string
const &value) {
536 _assertReplaceIndexInRange(key, i);
537 astMapPutElemC(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, value.c_str());
543 _assertReplaceIndexInRange(key, i);
544 AstObject *rawCopy =
reinterpret_cast<AstObject *
>(astCopy(value.
getRawPtr()));
545 astMapPutElemA(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str(), i, rawCopy);
554 void remove(std::string
const &
key) {
555 astMapRemove(reinterpret_cast<AstKeyMap *>(
getRawPtr()),
key.c_str());
564 void rename(std::string
const &oldKey, std::string
const &newKey) {
565 astMapRename(reinterpret_cast<AstKeyMap *>(
getRawPtr()), oldKey.c_str(), newKey.c_str());
573 int retVal = astMapType(reinterpret_cast<AstKeyMap *>(
getRawPtr()), key.c_str());
575 return static_cast<DataType>(retVal);
581 return std::static_pointer_cast<
KeyMap>(copyImpl<KeyMap, AstKeyMap>());
587 explicit KeyMap(AstKeyMap *rawKeyMap) :
Object(reinterpret_cast<AstObject *>(rawKeyMap)) {
589 std::ostringstream os;
590 os <<
"this is a " <<
getClassName() <<
", which is not a KeyMap";
591 throw std::invalid_argument(os.str());
597 void _assertVectorNotEmpty(std::string
const &
key,
int size)
const {
599 std::ostringstream os;
600 os <<
"vector supplied for key \"" << key <<
"\" has zero elements";
601 throw std::invalid_argument(os.str());
606 void _assertReplaceIndexInRange(std::string
const &key,
int i)
const {
607 int const len =
length(key);
608 if ((i < 0) || (i >= len)) {
609 std::ostringstream os;
610 os <<
"i = " << i <<
" not in range [0, " << len - 1 <<
"] for key \"" << key <<
"\"";
611 throw std::invalid_argument(os.str());
616 int _getAppendIndex(std::string
const &key)
const {
617 int const i =
length(key);
619 std::ostringstream os;
620 os <<
"key \"" << key <<
"\" not found";
621 throw std::invalid_argument(os.str());
void rename(std::string const &oldKey, std::string const &newKey)
Definition: KeyMap.h:564
void append(std::string const &key, short int value)
Append an element to a vector of short int in a KeyMap.
Definition: KeyMap.h:471
void replace(std::string const &key, int i, int value)
Replace an element of a vector of ints in a KeyMap.
Definition: KeyMap.h:514
void putI(std::string const &key, std::vector< int > const &vec, std::string const &comment="")
Add a vector of ints.
Definition: KeyMap.h:361
int getI(std::string const &key, int ind) const
Get one int value for a given key.
Definition: KeyMap.h:206
void putU(std::string const &key, std::string const &comment="")
Definition: KeyMap.h:444
short int getS(std::string const &key, int ind) const
Get one short int value for a given key.
Definition: KeyMap.h:229
AstObject const * getRawPtr() const
Definition: Object.h:289
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:535
virtual std::shared_ptr< Object > copyPolymorphic() const override
Definition: KeyMap.h:580
void putB(std::string const &key, std::vector< char unsigned > const &vec, std::string const &comment="")
Add a vector of chars.
Definition: KeyMap.h:389
std::string getClassName() const
Definition: Object.h:136
void putC(std::string const &key, std::vector< std::string > const &vec, std::string const &comment="")
Add a vector of strings.
Definition: KeyMap.h:404
bool defined(std::string const &key) const
Definition: KeyMap.h:113
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:287
void putI(std::string const &key, int value, std::string const &comment="")
Add an int.
Definition: KeyMap.h:355
double getD(std::string const &key, int ind) const
Get one double value for a given key.
Definition: KeyMap.h:160
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:521
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:146
int size() const
Get the number of keys.
Definition: KeyMap.h:153
void putF(std::string const &key, std::vector< float > const &vec, std::string const &comment="")
Add a vector of floats.
Definition: KeyMap.h:347
std::vector< float > getF(std::string const &key) const
Get all float values for a given key.
Definition: KeyMap.h:193
void append(std::string const &key, float value)
Append an element to a vector of floats in a KeyMap.
Definition: KeyMap.h:457
void replace(std::string const &key, int i, double value)
Replace an element of a vector of doubles in a KeyMap.
Definition: KeyMap.h:500
std::string getC(std::string const &key, int ind) const
Get one std::string value for a given key.
Definition: KeyMap.h:275
std::vector< double > getD(std::string const &key) const
Get all double values for a given key.
Definition: KeyMap.h:170
void replace(std::string const &key, int i, float value)
Replace an element of a vector of floats in a KeyMap.
Definition: KeyMap.h:507
std::vector< short int > getS(std::string const &key) const
Get all short int values for a given key.
Definition: KeyMap.h:239
void append(std::string const &key, int value)
Append an element to a vector of ints in a KeyMap.
Definition: KeyMap.h:464
void putS(std::string const &key, short int value, std::string const &comment="")
Add a short int.
Definition: KeyMap.h:369
void append(std::string const &key, double value)
Append an element to a vector of doubles in a KeyMap.
Definition: KeyMap.h:450
void putB(std::string const &key, char unsigned value, std::string const &comment="")
Add a char.
Definition: KeyMap.h:383
void append(std::string const &key, std::string const &value)
Append an element to a vector of strings in a KeyMap.
Definition: KeyMap.h:485
void append(std::string const &key, char unsigned value)
Append an element to a vector of char in a KeyMap.
Definition: KeyMap.h:478
bool hasKey(std::string const &key) const
Definition: KeyMap.h:138
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:528
void putD(std::string const &key, std::vector< double > const &vec, std::string const &comment="")
Add a vector of double.
Definition: KeyMap.h:333
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:542
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:375
std::shared_ptr< KeyMap > copy() const
Return a deep copy of this object.
Definition: KeyMap.h:103
void putF(std::string const &key, float value, std::string const &comment="")
Add a float.
Definition: KeyMap.h:341
char unsigned getB(std::string const &key, int ind) const
Get one char value for a given key.
Definition: KeyMap.h:252
std::vector< char unsigned > getB(std::string const &key) const
Get all char values for a given key.
Definition: KeyMap.h:262
DataType
Definition: base.h:62
std::string key(int ind) const
Get the key at the specified index.
Definition: KeyMap.h:121
float getF(std::string const &key, int ind) const
Get one float value for a given key.
Definition: KeyMap.h:183
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:306
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:317
void putC(std::string const &key, std::string const &value, std::string const &comment="")
Add a string.
Definition: KeyMap.h:398
void putA(std::string const &key, Object const &obj, std::string const &comment="")
Add an Object, which is deep copied.
Definition: KeyMap.h:417
void append(std::string const &key, Object const &value)
Append an element to a vector of Objects in a KeyMap.
Definition: KeyMap.h:492
KeyMap(AstKeyMap *rawKeyMap)
Definition: KeyMap.h:587
DataType type(std::string const &key)
Definition: KeyMap.h:572
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:424
void putD(std::string const &key, double value, std::string const &comment="")
Add a double value.
Definition: KeyMap.h:327
std::vector< int > getI(std::string const &key) const
Get all int values for a given key.
Definition: KeyMap.h:216