diff options
Diffstat (limited to 'Skin++/src/Clcm.cxx')
| -rwxr-xr-x | Skin++/src/Clcm.cxx | 1308 |
1 files changed, 1308 insertions, 0 deletions
diff --git a/Skin++/src/Clcm.cxx b/Skin++/src/Clcm.cxx new file mode 100755 index 0000000..4ea27ca --- /dev/null +++ b/Skin++/src/Clcm.cxx @@ -0,0 +1,1308 @@ + +/*****************************************/ +/* C++ LCM OBJECT WRAPPER */ +/* AUTHOR: A. HEBERT ; 2024/08/04 */ +/*****************************************/ + +/* +Copyright (C) 2010 Ecole Polytechnique de Montreal + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. +*/ + +#include "Clcm.hxx" + +using namespace std; +using namespace ganlib; +static ostringstream hsmg; + +/* abort condition setting */ +void xabort_c(char *msg){ + cout << "Clcm xabort called: " << string(msg) << endl; + throw LCMexception(msg); +} + +ganlib::Clcm::Clcm(const string stype, const string myName, const string myPath) { + cout << "New Clcm object called '" << myName << "'" << endl; + this->root = this; + this->global_list = new vector<AnyPtr>; + this->isroot = true; + this->version = 4; + bool l_import = false; + bool l_exists = false; + int_32 imode=0; + if (stype == "LCM") { + this->objtype = 1; + } else if (stype == "XSM") { + DIR *dp; + struct dirent *dirp; + this->objtype = 2; + vector<string> names = vector<string>(); + if((dp = opendir(myPath.c_str())) == NULL) { + hsmg << "no XSM file found (missing directory name: '" << myPath << ")'" << endl; + throw LCMexception(hsmg.str()); + } + while ((dirp = readdir(dp)) != NULL) { + names.push_back(string(dirp->d_name)); + } + closedir(dp); + for (size_t i=0; i<names.size(); i++) { + if (names[i] == myName) l_exists = true; + } + } else if (stype == "BINARY") { + this->objtype = 3; + } else if (stype == "ASCII") { + this->objtype = 4; + } else if (stype == "DA") { + this->objtype = 5; + } else if (stype == "LCM_IMP_BINARY") { + imode = 1; + this->objtype = 1; + l_import = true; + } else if (stype == "XSM_IMP_BINARY") { + imode = 1; + this->objtype = 2; + l_import = true; + } else if (stype == "LCM_IMP_ASCII") { + imode = 2; + this->objtype = 1; + l_import = true; + } else if (stype == "XSM_IMP_ASCII") { + imode = 2; + this->objtype = 2; + l_import = true; + } else if (stype == "LCM_IMP_ASCII_V3") { + imode = 2; + this->objtype = 1; + this->version = 3; + l_import = true; + } else { + throw LCMexception("invalid type: '" + stype + "'"); + } + this->access = 0; + this->name = myName; + this->path = myPath; + this->addr = NULL; + this->lrda = 128; + try { + if (l_exists) { + this->addr = NULL; + cout << "XSM file " << path << myName << " already exists\n"; + this->open("READ-ONLY"); + this->access = 2; + } else { + this->open("NEW"); + this->access = 1; + } + } catch(...) { + throw LCMexception("Exception catched by new(1)"); + } + if (this->objtype <= 2) { + this->nammy = "/"; + this->empty = true; + this->ilong = -1; + } + if (l_import) { + this->empty = false; + this->untoutched = false; + try { + DIR *dp; + struct dirent *dirp; + vector<string> names = vector<string>(); + if((dp = opendir(myPath.c_str())) == NULL) { + hsmg << "no ASCII file found (missing directory name: '" << myPath << ")'" << endl; + throw LCMexception(hsmg.str()); + } + while ((dirp = readdir(dp)) != NULL) { + names.push_back(string(dirp->d_name)); + } + closedir(dp); + for (size_t i=0; i<names.size(); i++) { + string::size_type loc = names[i].find("_"); + if( loc != string::npos ) { + string fileName = names[i].substr(loc, string::npos); + if (fileName == "_"+this->name) { + FILE *file; + file = fopen((myPath+names[i]).c_str(), "r"); + if (this->version == 4) { + lcmexp_c(&(this->addr), 0, file, imode, 2); + } + else { + lcmexpv3_c(&(this->addr), 0, file, imode, 2); + } + fclose(file); + return; + } + } + } + // Modified R. Chambon 09/2011 + for (size_t i=0; i<names.size(); i++) { + if (myName.compare(names[i]) == 0) { + FILE *file; + file = fopen((myPath+names[i]).c_str(), "r"); + if (this->version == 4) { + lcmexp_c(&(this->addr), 0, file, imode, 2); + } + else { + lcmexpv3_c(&(this->addr), 0, file, imode, 2); + } + fclose(file); + return; + } + } + // + hsmg << "File '" << "_" << this->name << "' not found in '" << myPath <<"'"; + throw LCMexception(hsmg.str()); + } catch(...) { + throw LCMexception("Exception catched by new(2)"); + } + } +} + +ganlib::Clcm::Clcm(lcm *daughter, Clcm *root, const int_32 type, const string name, const int_32 ilong, const string key) { + this->global_list = root->global_list; + this->root = root; + this->addr = daughter; + this->access = 1; + this->name = name; + this->path = "./"; + this->nammy = key; + this->empty = true; + this->ilong = ilong; + this->objtype = type; + this->untoutched = false; + this->isroot = false; + this->version = root->version; +} + +ganlib::Clcm::Clcm(lcm *myLcm, const int_32 type, const int_32 access, const string OSname) { + this->root = this; + this->global_list = new vector<AnyPtr>; + this->isroot = false; + this->version = 4; + this->addr = myLcm; + this->access = access; + this->ilong = -1; + this->objtype = type-2; + this->empty = false; + this->name = OSname; + this->nammy = "/"; + this->path = ""; + this->untoutched = true; +} + +ganlib::Clcm::Clcm(const string stype, ClcmPtr myClcm) { + if (myClcm->objtype > 2) throw LCMexception("copy constructor not available for file objects"); + if (stype == "LCM") { + this->objtype = 1; + } else if (stype == "XSM") { + this->objtype = 2; + } + bool lopen = true; + if (myClcm->access == 0) { + lopen = false; + myClcm->open("READ-ONLY"); + } + this->version = root->version; + this->name = myClcm->name + ".bis"; + cout << "New Clcm object (clone) called '" << this->name << "'" << endl; + this->open("NEW"); + this->access = 1; + lcm *myLcm = myClcm->addr; + lcmequ_c(&myLcm, &(this->addr)); + this->root = this; + this->global_list = new vector<AnyPtr>; + this->isroot = true; + this->path = myClcm->path; + this->lrda = myClcm->lrda; + if (!lopen) { + myClcm->close("KEEP"); + this->close("KEEP"); + } +} + +ganlib::Clcm::~Clcm() { + if (this->isroot) { + cout << "Clcm root destructor called. LCM object=" << this->name << endl; + if ((this->addr != NULL) & (this->access == 1)) { + cout << "Destroy object " << this->name << endl; + this->close("DESTROY"); + } else if ((this->addr != NULL) & (this->access == 2)) { + cout << "Keep object " << this->name << endl; + this->close("KEEP"); + } + if (this->global_list != NULL) delete this->global_list; + } +} + +ostream & ganlib::operator<<(ostream &s, ClcmPtr myClcm) { + if (myClcm->objtype > 2) throw LCMexception("operator<< not available for file objects"); + FILE *file = fopen("_dummy.txt", "w"); + if (file == NULL) { + throw LCMexception("fopen failure in operator<<. file=_dummy.txt"); + } + lcmexp_c(&(myClcm->addr), 0, file, 2, 1); + fclose(file); + ifstream ifs ( "_dummy.txt" , ifstream::in ); + while (ifs.good()) s << (char) ifs.get(); + ifs.close(); + if( remove("_dummy.txt") != 0 ) { + throw LCMexception("Error deleting file after <<: _dummy.txt"); + } + return s; +} + +void ganlib::Clcm::expor(const string stype) { + this->expor(stype, "_"+this->name); +} + +void ganlib::Clcm::expor(const string stype, const string new_name) { + if (this->objtype > 2) throw LCMexception("expor not available for file objects"); + int_32 imode; + if (stype == "BINARY") { + imode = 1; + } else if (stype == "ASCII") { + imode = 2; + } else { + throw LCMexception("invalid type: '" + stype + "'"); + } + size_t found=new_name.find("_"); + if (found == string::npos) { + throw LCMexception("Export file name ("+new_name+") must contains _"); + } + FILE *file = fopen(new_name.c_str(), "w"); + if (file == NULL) { + throw LCMexception("fopen failure in expor(). file="+new_name); + } + lcmexp_c(&(this->addr), 0, file, imode, 1); + fclose(file); +} + +void ganlib::Clcm::except() { + throw LCMexception("Programmer-triggered exception"); +} + +string ganlib::Clcm::getName() throw() { + return this->name; +} + +string ganlib::Clcm::getPath() throw() { + return this->path; +} + +int_32 ganlib::Clcm::getType() throw() { + return this->objtype; +} + +int_32 ganlib::Clcm::getLength() { + char namlcm[73], nammy[13]; + int_32 empty, ilong, lcml, access; + if (this->objtype > 2) throw LCMexception("getLength not available for file objects"); + lcminf_c(&(this->addr), namlcm, nammy, &empty, &ilong, &lcml, &access); + return ilong; +} + +string ganlib::Clcm::getDirectory() { + char namlcm[73], nammy[13]; + int_32 empty, ilong, lcml, access; + if (this->objtype > 2) throw LCMexception("getDirectory not available for file objects"); + lcminf_c(&(this->addr), namlcm, nammy, &empty, &ilong, &lcml, &access); + return nammy; +} + +int_32 ganlib::Clcm::getAccess() { + char namlcm[73], nammy[13]; + int_32 empty, ilong, lcml; + if (this->objtype <= 2) { + lcminf_c(&(this->addr), namlcm, nammy, &empty, &ilong, &lcml, &(this->access)); + } + return this->access; +} + +int_32 ganlib::Clcm::getLrda() throw() { + return this->lrda; +} + +int_32 ganlib::Clcm::getVersion() throw() { + return this->version; +} + +bool ganlib::Clcm::isEmpty() { + char namlcm[73], nammy[13]; + int_32 empty, ilong, lcml, access; + if (this->objtype > 2) throw LCMexception("isEmpty not available for file objects"); + lcminf_c(&(this->addr), namlcm, nammy, &empty, &ilong, &lcml, &access); + return empty; +} + +bool ganlib::Clcm::isNew() throw() { + return this->untoutched; +} + +void ganlib::Clcm::open(const string saccess) { + if (this->access != 0) { + throw LCMexception("the object " + this->name + " is already open"); + } + if (saccess == "NEW") { + this->untoutched = true; + } else if (saccess == "READ/WRITE") { + if ((this->addr == NULL)&(this->objtype == 1)) { + throw LCMexception("the object " + this->name + " is destroyed(1)"); + } + this->access = 1; + this->untoutched = false; + } else if (saccess == "READ-ONLY") { + if ((this->addr == NULL)&(this->objtype == 1)) { + throw LCMexception("the object " + this->name + " is destroyed(2)"); + } + this->access = 2; + this->untoutched = false; + } else { + throw LCMexception("invalid access: '" + saccess + "'"); + } + if (this->objtype == 1) { + try { + lcmop_c(&(this->addr), (char *)(this->name).c_str(), this->access, this->objtype, 99); + } catch(...) { + throw LCMexception("Exception catched by open (1)"); + } + } else if (this->objtype == 2) { + try { + lcmop_c(&(this->addr), (char *)(this->path+this->name).c_str(), this->access, this->objtype, 0); + } catch(...) { + throw LCMexception("Exception catched by open (1)"); + } + } else if (this->objtype <= 5) { + this->addr = NULL; + bool exs = false; + DIR *dp; + struct dirent *dirp; + vector<string> names = vector<string>(); + if((dp = opendir(this->path.c_str())) == NULL) { + hsmg << "no file found (missing directory name: '" << this->path << ")'" << endl; + throw LCMexception(hsmg.str()); + } + while ((dirp = readdir(dp)) != NULL) { + names.push_back(string(dirp->d_name)); + } + closedir(dp); + for (size_t i=0; i<names.size(); i++) { + if (names[i] == this->name) exs = true; + } + if (this->access == 0) { + if (exs) { + hsmg << "New file " << this->path << this->name << " exists";; + throw LCMexception(hsmg.str()); + } + } else if (this->access == 1) { + if (!exs) { + hsmg << "Old file " << this->path << this->name << " does not exist(1)";; + throw LCMexception(hsmg.str()); + } + } else if (this->access == 2) { + if (!exs) { + hsmg << "Old file " << this->path << this->name << " does not exist(2)";; + throw LCMexception(hsmg.str()); + } + } + } else { + hsmg << "invalid type in open (" << this->objtype << ")"; + throw LCMexception(hsmg.str()); + } +} + +void ganlib::Clcm::close(const string saccess) { + int iact; + if (saccess == "KEEP") { + iact = 1; + } else if (saccess == "DESTROY") { + iact = 2; + } else if (saccess == "ERASE") { + iact = 3; + } else { + throw LCMexception("invalid condition: '" + saccess + "'"); + } + if (this->access != 0) { + if (this->objtype <= 2) { + try { + lcmcl_c(&(this->addr), iact); + } catch(...) { + throw LCMexception("Exception catched by close(1)"); + } + } else if (this->objtype <= 5) { + if (iact >= 2) { + try { + this->aFile.close(); + if( remove((this->path+this->name).c_str()) != 0 ) { + throw LCMexception("Error deleting file: " + this->path + this->name); + } + cout << "File deleted:" << this->path << this->name << endl; + } catch(...) { + throw LCMexception("Exception catched by close(2)"); + } + } + } + } else { + throw LCMexception("the object " + this->name + " is already closed"); + } + if (iact == 2) { + this->addr = NULL; + } + this->access = 0; +} + +int_32 ganlib::Clcm::length(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("length not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (itylcm == 3) mylength=4*mylength; + return mylength; +} + +int_32 ganlib::Clcm::length(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("length not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (itylcm == 3) mylength=4*mylength; + return mylength; +} + +int_32 ganlib::Clcm::type(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("type not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (itylcm == 99) { + hsmg << "length: no block named '" << key << "'"; + throw LCMexception(hsmg.str()); + } + return itylcm; +} + +int_32 ganlib::Clcm::type(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("type not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (itylcm == 99) { + hsmg << "length: no block at position " << iset << "."; + throw LCMexception(hsmg.str()); + } + return itylcm; +} + +void ganlib::Clcm::lib() { + if (this->objtype > 2) throw LCMexception("lib not available for file objects"); + lcmlib_c(&(this->addr)); +} + +void ganlib::Clcm::val() { + if (this->objtype > 2) throw LCMexception("val not available for file objects"); + lcmval_c(&(this->addr), " "); +} + +//---------------------------------------------------------------------- +//-- set -- +//---------------------------------------------------------------------- + +ClcmPtr ganlib::Clcm::setDictionary(const std::string key) { + if (this->objtype > 2) throw LCMexception("setDictionary not available for file objects"); + lcm *daughter = lcmdid_c(&(this->addr), (char *)key.c_str()); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, -1, key)); +} + +ClcmPtr ganlib::Clcm::setDictionary(const int_32 iset) { + if (this->objtype > 2) throw LCMexception("setDictionary not available for file objects"); + lcm *daughter = lcmdil_c(&(this->addr), iset); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, -1, " ")); +} + +ClcmPtr ganlib::Clcm::setList(const std::string key, const int_32 ilong) { + if (this->objtype > 2) throw LCMexception("setList not available for file objects"); + lcm *daughter = lcmlid_c(&(this->addr), (char *)key.c_str(), ilong); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, 0, key)); +} + +ClcmPtr ganlib::Clcm::setList(const int_32 iset, const int_32 ilong) { + if (this->objtype > 2) throw LCMexception("setList not available for file objects"); + lcm *daughter = lcmlil_c(&(this->addr), iset, ilong); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, 0, " ")); +} + +//---------------------------------------------------------------------- +//-- get -- +//---------------------------------------------------------------------- + +ClcmPtr ganlib::Clcm::getClcm(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getClcm not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getClcm(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } + if (itylcm == 0) { + lcm *daughter = lcmgid_c(&(this->addr), (char *)key.c_str()); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, -1, key)); + } else if (itylcm == 10) { + lcm *daughter = lcmgid_c(&(this->addr), (char *)key.c_str()); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, 0, key)); + } else { + hsmg << "getClcm(" << key << ") expecting a Clcm object(1)"; + throw LCMexception(hsmg.str()); + } +} + +ClcmPtr ganlib::Clcm::getClcm(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getClcm not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getClcm(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } + if (itylcm == 0) { + lcm *daughter = lcmgil_c(&(this->addr), iset); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, -1, " ")); + } else if (itylcm == 10) { + lcm *daughter = lcmgil_c(&(this->addr), iset); + return ClcmPtr(new Clcm(daughter, this->root, this->objtype, this->name, 0, " ")); + } else { + hsmg << "getClcm(" << iset << ") expecting a Clcm object(2)"; + throw LCMexception(hsmg.str()); + } +} + +/// @cond DEV +// Use this destructor to avoid deleting LCM array pointed by the shared_array object +template<typename T> +struct my_deleter +{ + void operator()(T* p) { } +}; +/// @endcond + +IntPtrConst ganlib::Clcm::getInt(const std::string key) { + int_32 mylength, itylcm; + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getInt(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 1) { + hsmg << "getInt(" << key << ") expecting an integer array(1)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + int_32 *array; + lcmgpd_c(&(this->addr), (char *)key.c_str(), &array); + IntPtrConst iarray(array, my_deleter<const int_32>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + IntPtrConst iarray(new int_32[mylength]); + lcmget_c(&(this->addr), (char *)key.c_str(), (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getInt not available for file objects"); + } +} + +IntPtrConst ganlib::Clcm::getInt(const int_32 iset) { + int_32 mylength, itylcm; + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getInt(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 1) { + hsmg << "getInt(" << iset << ") expecting an integer array(2)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + int_32 *array; + lcmgpl_c(&(this->addr), iset, &array); + IntPtrConst iarray(array, my_deleter<const int_32>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + IntPtrConst iarray(new int_32[mylength]); + lcmgdl_c(&(this->addr), iset, (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getInt not available for file objects"); + } +} + +FloatPtrConst ganlib::Clcm::getFloat(const std::string key) { + int_32 mylength, itylcm; + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getFloat(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 2) { + hsmg << "getFloat(" << key << ") expecting a single precision real array(1)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + float_32 *array; + lcmgpd_c(&(this->addr), (char *)key.c_str(), (int_32 **)&array); + FloatPtrConst iarray(array, my_deleter<const float_32>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + FloatPtrConst iarray(new float_32[mylength]); + lcmget_c(&(this->addr), (char *)key.c_str(), (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getFloat not available for file objects"); + } +} + +FloatPtrConst ganlib::Clcm::getFloat(const int_32 iset) { + int_32 mylength, itylcm; + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getFloat(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 2) { + hsmg << "getFloat(" << iset << ") expecting a single precision real array(2)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + float_32 *array; + lcmgpl_c(&(this->addr), iset, (int_32 **)&array); + FloatPtrConst iarray(array, my_deleter<const float_32>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + FloatPtrConst iarray(new float_32[mylength]); + lcmgdl_c(&(this->addr), iset, (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getFloat not available for file objects"); + } +} + +StringPtrConst ganlib::Clcm::getString(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getString not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getString(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 3) { + hsmg << "getString(" << key << ") expecting a character array(1)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpd_c(&(this->addr), (char *)key.c_str(), &iarray); + return StringPtrConst(new string((char*)iarray, 4*mylength)); +} + +StringPtrConst ganlib::Clcm::getString(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getString not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getString(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 3) { + hsmg << "getString(" << iset << ") expecting a character array(2)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpl_c(&(this->addr), iset, &iarray); + return StringPtrConst(new string((char*)iarray, 4*mylength)); +} + +StringVecPtr ganlib::Clcm::getVecString(const std::string key, const int_32 size) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getVecString not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getVecString(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 3) { + hsmg << "getVecString(" << key << ") expecting a character array(1)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpd_c(&(this->addr), (char *)key.c_str(), &iarray); + StringVecPtr ivecPtr = StringVecPtr(new vector<string>); + for (int i=0; i<size; i++) { + int_32 nbchar = ( mylength*4 + size - 1) / size; + int_32 istart = nbchar*i; + if (i == size-1) nbchar = mylength*4 - nbchar*i; + if (nbchar != 0) { + string myString = string((char *)iarray, istart, nbchar); + ivecPtr->push_back(myString.substr(0, myString.find_last_not_of(" ")+1)); + } + } + return ivecPtr; +} + +StringVecPtr ganlib::Clcm::getVecString(const int_32 iset, const int_32 size) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getVecString not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getVecString(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 3) { + hsmg << "getVecString(" << iset << ") expecting a character array(2)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpl_c(&(this->addr), iset, &iarray); + StringVecPtr ivecPtr = StringVecPtr(new vector<string>); + for (int i=0; i<size; i++) { + int_32 nbchar = ( mylength*4 + size - 1) / size; + int_32 istart = nbchar*i; + if (i == size-1) nbchar = mylength*4 - nbchar*i; + if (nbchar != 0) { + string myString = string((char *)iarray, istart, nbchar); + ivecPtr->push_back(myString.substr(0, myString.find_last_not_of(" ") + 1)); + } + } + return ivecPtr; +} + +DoublePtrConst ganlib::Clcm::getDouble(const std::string key) { + int_32 mylength, itylcm; + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getDouble(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 4) { + hsmg << "getDouble(" << key << ") expecting a double precision real array(1)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + double_64 *array; + lcmgpd_c(&(this->addr), (char *)key.c_str(), (int_32 **)&array); + DoublePtrConst iarray(array, my_deleter<const double_64>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + DoublePtrConst iarray(new double_64[mylength]); + lcmget_c(&(this->addr), (char *)key.c_str(), (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getDouble not available for file objects"); + } +} + +DoublePtrConst ganlib::Clcm::getDouble(const int_32 iset) { + int_32 mylength, itylcm; + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getDouble(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 4) { + hsmg << "getDouble(" << iset << ") expecting a double precision real array(2)"; + throw LCMexception(hsmg.str()); + } + if (this->objtype == 1) { + // Use a reference without copy (pinning). + double_64 *array; + lcmgpl_c(&(this->addr), iset, (int_32 **)&array); + DoublePtrConst iarray(array, my_deleter<const double_64>()); + return iarray; + } else if (this->objtype == 2) { + // Use a reference with copy. + DoublePtrConst iarray(new double_64[mylength]); + lcmgdl_c(&(this->addr), iset, (int_32 *)iarray.get()); + return iarray; + } else { + throw LCMexception("getDouble not available for file objects"); + } +} + +BoolPtrConst ganlib::Clcm::getBool(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getBool not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getBool(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 5) { + hsmg << "getBool(" << key << ") expecting a boolean array(1)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpd_c(&(this->addr), (char *)key.c_str(), &iarray); + BoolPtrConst ibool(new bool[mylength]); + bool *myBool = (bool *)ibool.get(); + for (int i=0; i<mylength; i++) myBool[i] = (iarray[i] == 1); + return ibool; +} + +BoolPtrConst ganlib::Clcm::getBool(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getBool not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getBool(" << iset << ") entry is missing(2)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 5) { + hsmg << "getBool(" << iset << ") expecting a boolean array(2)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpl_c(&(this->addr), iset, &iarray); + BoolPtrConst ibool(new bool[mylength]); + bool *myBool = (bool *)ibool.get(); + for (int i=0; i<mylength; i++) myBool[i] = (iarray[i] == 1); + return ibool; +} + +ComplexPtrConst ganlib::Clcm::getComplex(const std::string key) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getComplex not available for file objects"); + lcmlen_c(&(this->addr), (char *)key.c_str() ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getComplex(" << key << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 6) { + hsmg << "getComplex(" << key << ") expecting a Complex array(1)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpd_c(&(this->addr), (char *)key.c_str(), &iarray); + complex<float_32> *icomplex = new complex<float_32>[mylength]; + for (int i=0; i<mylength; i++) { + icomplex[i] = complex<float_32>((float_32)iarray[2*i],(float_32)iarray[1+2*i]); + } + return ComplexPtrConst(icomplex); +} + +ComplexPtrConst ganlib::Clcm::getComplex(const int_32 iset) { + int_32 mylength, itylcm; + if (this->objtype > 2) throw LCMexception("getComplex not available for file objects"); + lcmlel_c(&(this->addr), iset ,&mylength, &itylcm); + if (mylength == 0) { + hsmg << "getComplex(" << iset << ") entry is missing(1)"; + throw LCMexception(hsmg.str()); + } else if (itylcm != 6) { + hsmg << "getComplex(" << iset << ") expecting a Complex array(2)"; + throw LCMexception(hsmg.str()); + } + // Use a reference with copy. + int_32 *iarray; + lcmgpl_c(&(this->addr), iset, &iarray); + complex<float_32> *icomplex = new complex<float_32>[mylength]; + for (int i=0; i<mylength; i++) { + icomplex[i] = complex<float_32>((float_32)iarray[2*i],(float_32)iarray[1+2*i]); + } + return ComplexPtrConst(icomplex); +} + +//---------------------------------------------------------------------- +//-- keys -- +//---------------------------------------------------------------------- + +StringVecPtr ganlib::Clcm::keys() { + if (this->objtype > 2) throw LCMexception("keys not available for file objects"); + if (this->getLength() != -1) throw LCMexception("keys only available for dictionaries"); + StringVecPtr ivecPtr = StringVecPtr(new vector<string>); + char first[13], key[13]; + strcpy(first, " "); + lcmnxt_c(&(this->addr), first); + strcpy(key, first); + while (true) { + lcmnxt_c(&(this->addr), key); + ivecPtr->push_back(string(key)); + if (strcmp(key, first) == 0) break; + } + return ivecPtr; +} + +//---------------------------------------------------------------------- +//-- put -- +//---------------------------------------------------------------------- + +void ganlib::Clcm::put(const std::string key, IntPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + int_32 *myArrayPointer = (int_32 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 1, myArrayPointer); + refpush(&(this->addr), myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) iarray[i] = myArrayPointer[i]; + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 1, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr); + xsmput_c(&ipxsm, (char *)key.c_str(), myLength, 1, myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, IntPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + int_32 *myArrayPointer = (int_32 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppl_c(&(this->addr), iset, myLength, 1, myArrayPointer); + refpush(&(this->addr), myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) iarray[i] = myArrayPointer[i]; + lcmppl_c(&(this->addr), iset, myLength, 1, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr) + iset; + xsmput_c(&ipxsm, " ", myLength, 1, myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, FloatPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + float_32 *myArrayPointer = (float_32 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 2, (int_32 *)myArrayPointer); + refpush(&(this->addr), (int_32 *)myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) iarray[i] = (int_32)myArrayPointer[i]; + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 2, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr); + xsmput_c(&ipxsm, (char *)key.c_str(), myLength, 2, (int_32 *)myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, FloatPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + float_32 *myArrayPointer = (float_32 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppl_c(&(this->addr), iset, myLength, 2, (int_32 *)myArrayPointer); + refpush(&(this->addr), (int_32 *)myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) iarray[i] = (int_32)myArrayPointer[i]; + lcmppl_c(&(this->addr), iset, myLength, 2, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr) + iset; + xsmput_c(&ipxsm, " ", myLength, 2, (int_32 *)myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, StringPtr myArray) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if ((myArray.get())->length() <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + int_32 ilen = ((myArray.get())->length()+3)/4; + int_32 *iarray = (int_32 *)setara_c(ilen); + for (int i=0; i<ilen; i++) memcpy((char *)&iarray[i], " ", 4); + string myString = *myArray.get(); + strncpy((char *)iarray, myString.c_str(), myString.length()); + lcmppd_c(&(this->addr), (char *)key.c_str(), ilen, 3, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, StringPtr myArray) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if ((myArray.get())->length() <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + int_32 ilen = ((myArray.get())->length()+3)/4; + int_32 *iarray = (int_32 *)setara_c(ilen); + for (int i=0; i<ilen; i++) memcpy((char *)&iarray[i], " ", 4); + string myString = *myArray.get(); + strncpy((char *)iarray, myString.c_str(), myString.length()); + lcmppl_c(&(this->addr), iset, ilen, 3, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, StringVecPtr myArray) { + const vector<string> *ivec = (vector<string>*)myArray.get(); + const int_32 mySize = ivec->size(); + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (mySize <= 0) { + hsmg << "put(" << key << ") has zero size(1)"; + throw LCMexception(hsmg.str()); + } + int_32 maxLength = 0; + for (int i=0; i<mySize; i++) { + maxLength = max(maxLength, (int_32)(*ivec)[i].length()); + } + if (maxLength == 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + maxLength = (maxLength+3)/4; + int_32 *iarray = (int_32 *)setara_c(maxLength*mySize); + for (int i=0; i<maxLength*mySize; i++) memcpy((char *)&iarray[i], " ", 4); + for (int i=0; i<mySize; i++) { + string myString = (*ivec)[i]; + strncpy((char *)&iarray[maxLength*i], myString.c_str(), myString.length()); + } + lcmppd_c(&(this->addr), (char *)key.c_str(), maxLength*mySize, 3, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, StringVecPtr myArray) { + const vector<string> *ivec = (vector<string>*)myArray.get(); + const int_32 mySize = ivec->size(); + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (mySize <= 0) { + hsmg << "put(" << iset << ") has zero size(2)"; + throw LCMexception(hsmg.str()); + } + int_32 maxLength = 0; + for (int i=0; i<mySize; i++) { + maxLength = max(maxLength, (int_32)(*ivec)[i].length()); + } + if (maxLength == 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + maxLength = (maxLength+3)/4; + int_32 *iarray = (int_32 *)setara_c(maxLength*mySize); + for (int i=0; i<maxLength*mySize; i++) memcpy((char *)(&iarray[i]), " ", 4); + for (int i=0; i<mySize; i++) { + string myString = (*ivec)[i]; + strncpy((char *)(&iarray[maxLength*i]), myString.c_str(), myString.length()); + } + lcmppl_c(&(this->addr), iset, maxLength*mySize, 3, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, DoublePtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + double_64 *myArrayPointer = (double_64 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 4, (int_32 *)myArrayPointer); + refpush(&(this->addr), (int_32 *)myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(2*myLength); + for (int i=0; i<2*myLength; i++) iarray[i] = ((int_32 *)myArrayPointer)[i]; + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 4, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr); + xsmput_c(&ipxsm, (char *)key.c_str(), myLength, 4, (int_32 *)myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, DoublePtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + double_64 *myArrayPointer = (double_64 *)myArray.get(); + if ((this->objtype == 1) && (this->global_list != NULL)) { + // Use a reference without copy (pinning) for memory-resident lcm objects. + lcmppl_c(&(this->addr), iset, myLength, 4, (int_32 *)myArrayPointer); + refpush(&(this->addr), (int_32 *)myArrayPointer); + (this->global_list)->push_back(myArray); + } else if (this->objtype == 1) { + // Use a reference with copy for memory-resident lcm objects (the lcm object is + // coming from outside C++). + int_32 *iarray = setara_c(2*myLength); + for (int i=0; i<2*myLength; i++) iarray[i] = ((int_32 *)myArrayPointer)[i]; + lcmppl_c(&(this->addr), iset, myLength, 4, iarray); + } else if (this->objtype == 2) { + // Use a reference with copy for xsm file objects. + xsm *ipxsm = (xsm *)(this->addr) + iset; + xsmput_c(&ipxsm, " ", myLength, 4, (int_32 *)myArrayPointer); + } + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, BoolPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + bool *myArrayPointer = (bool *)myArray.get(); + // Use a reference with copy. + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) { + myArrayPointer[i] ? iarray[2*i] = 1 : iarray[2*i] = 0; + } + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 5, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, BoolPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + bool *myArrayPointer = (bool *)myArray.get(); + // Use a reference with copy. + int_32 *iarray = setara_c(myLength); + for (int i=0; i<myLength; i++) { + myArrayPointer[i] ? iarray[2*i] = 1 : iarray[2*i] = 0; + } + lcmppl_c(&(this->addr), iset, myLength, 5, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, ComplexPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << key << ") has zero length(1)"; + throw LCMexception(hsmg.str()); + } + complex<float_32> *myArrayPointer = (complex<float_32> *)myArray.get(); + // Use a reference with copy. + int_32 *iarray = setara_c(2*myLength); + for (int i=0; i<myLength; i++) { + iarray[2*i] = (int_32)myArrayPointer[i].real(); + iarray[1+2*i] = (int_32)myArrayPointer[i].imag(); + } + lcmppd_c(&(this->addr), (char *)key.c_str(), myLength, 6, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const int_32 iset, ComplexPtr myArray, const int_32 myLength) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } else if (myLength <= 0) { + hsmg << "put(" << iset << ") has zero length(2)"; + throw LCMexception(hsmg.str()); + } + complex<float_32> *myArrayPointer = (complex<float_32> *)myArray.get(); + // Use a reference with copy. + int_32 *iarray = setara_c(2*myLength); + for (int i=0; i<myLength; i++) { + iarray[2*i] = (int_32)myArrayPointer[i].real(); + iarray[1+2*i] = (int_32)myArrayPointer[i].imag(); + } + lcmppl_c(&(this->addr), iset, myLength, 6, iarray); + myArray.reset(); + return; +} + +void ganlib::Clcm::put(const std::string key, ClcmPtr myClcm) { + if (this->getAccess() != 1) { + hsmg << "put(" << key << ") forbidden if the object is not open in modification mode(1)"; + throw LCMexception(hsmg.str()); + } + lcm *daughter = lcmgid_c(&(this->addr), (char *)key.c_str()); + lcm *myLcm = myClcm->addr; + lcmequ_c(&myLcm, &daughter); + return; +} + +void ganlib::Clcm::put(const int_32 iset, ClcmPtr myClcm) { + if (this->getAccess() != 1) { + hsmg << "put(" << iset << ") forbidden if the object is not open in modification mode(2)"; + throw LCMexception(hsmg.str()); + } + lcm *daughter = lcmgil_c(&(this->addr), iset); + lcm *myLcm = myClcm->addr; + lcmequ_c(&myLcm, &daughter); + return; +} + +lcm *ganlib::Clcm::extract() { + return this->addr; +} |
