/// /// \file PVGroup.h /// /// \author Jan Chrin /// \date November 2014 /// #ifndef PVGROUP_H #define PVGROUP_H #include /** * class MemberMap * maps string to index */ class MemberMap { typedef std::map mapLongString; private: mapLongString mapNameIndex; mapLongString::iterator pos; Helper helper; public: MemberMap() {}; ~MemberMap() {}; void insert(int a, std::string _Name) { mapNameIndex.insert(std::make_pair(a, _Name)); }; std::string getPV (int i) { pos = mapNameIndex.find(i); if (pos != mapNameIndex.end()) return pos->second; std::cout << "Index " << i << " not found! Size of group vector is " << mapNameIndex.size() << std::endl; return ""; }; int getIndex (std::string _Name) { char pvStripped[PVNAME_SIZE]; helper.removeLeadingAndTrailingSpaces(_Name.c_str(), pvStripped); std::string Name=pvStripped; for (pos=mapNameIndex.begin(); pos != mapNameIndex.end(); ++pos) { if (pos->second==Name) { return pos->first; } // String searches such as s.find(s1) return string::npos on failure //else if ( (pos->second).find(Name) != std::string::npos) return pos->first; } std::cout << "PV: " << Name << " IS NOT A MEMBER OF THIS LIST " << std::endl; return -1; }; }; /** * class PVGroup * This class is the holder of PVDataHolder objects associated with * of group of handles */ class PVGroup { friend class Connect; friend class CAFE; //if HAVE_LIBQTXML friend class restorePVGroupXMLParser; //endif private: PVDataHolder * pvdata; unsigned int npv; char name [PVGROUP_PSEUDO_SIZE]; int statusGroup; unsigned int groupHandle; bool isIndexOutOfRange (unsigned int idx) { return (idx >= npv) ? true:false; }; MemberMap memberMap; public: //Initialize 1st two to avoid compiler warning messages PVGroup() { npv=0; pvdata=NULL; statusGroup=ICAFE_NORMAL; groupHandle=0; strcpy(name,""); }; ~PVGroup() {}; MemberMap getMemberMap() const { return memberMap; }; PVDataHolder * getPVData() const { return pvdata; }; PVDataHolder getPVData(unsigned int idx) noexcept(false) //throw(std::out_of_range) { if(isIndexOutOfRange(idx)) { std::ostringstream oss; oss << "Exception! Index " << idx << " to PVGroup.pvdata() is out of range. Valid range is from 0 to " << npv-1; throw std::out_of_range(oss.str()); } return pvdata[idx]; }; void setHasAlarm(bool h) { for (unsigned int i=0; i