OpenRTM
1.0.0
|
00001 // -*- C++ -*- 00020 #ifndef COIL_PROPERTIES_H 00021 #define COIL_PROPERTIES_H 00022 00023 00024 #include <string> 00025 #include <vector> 00026 #include <map> 00027 #include <climits> 00028 00029 00045 namespace coil 00046 { 00101 class Properties 00102 { 00103 public: 00127 Properties(const char* key = "", const char* value = ""); 00128 00150 Properties(std::map<std::string, std::string>& defaults); 00151 00210 Properties(const char* defaults[], long num = LONG_MAX); 00211 00228 Properties(const Properties& prop); 00229 00247 Properties& operator=(const Properties& prop); 00248 00260 virtual ~Properties(void); 00261 00262 //============================================================ 00263 // public functions 00264 //============================================================ 00265 00283 inline const char* getName(void) const {return name.c_str();} 00284 00302 inline const char* getValue(void) const {return value.c_str();} 00303 00321 inline const char* getDefaultValue(void) const {return default_value.c_str();} 00322 00340 inline const std::vector<Properties*>& getLeaf(void) const {return leaf;} 00341 00359 inline const Properties* getRoot(void) const {return root;} 00360 00390 const std::string& getProperty(const std::string& key) const; 00391 00420 const std::string& getProperty(const std::string& key, 00421 const std::string& def) const; 00422 00451 const std::string& operator[](const std::string& key) const; 00452 00485 std::string& operator[](const std::string& key); 00486 00511 const std::string& getDefault(const std::string& key) const; 00512 00541 std::string setProperty(const std::string& key, const std::string& value); 00542 00566 std::string setDefault(const std::string& key, const std::string& value); 00567 00595 void setDefaults(const char* defaults[], long num = LONG_MAX); 00596 00597 //============================================================ 00598 // load and save functions 00599 //============================================================ 00621 void list(std::ostream& out); 00622 00749 void load(std::istream& inStream); 00750 00776 void save(std::ostream& out, const std::string& header); 00777 00860 void store(std::ostream& out, const std::string& header); 00861 00862 //============================================================ 00863 // other util functions 00864 //============================================================ 00890 std::vector<std::string> propertyNames(void) const; 00891 00909 int size(void) const; 00910 00933 Properties* const findNode(const std::string& key) const; 00956 Properties& getNode(const std::string& key); 00957 00984 bool createNode(const std::string& key); 00985 01009 Properties* removeNode(const char* leaf_name); 01010 01034 Properties* hasKey(const char* key) const; 01035 01043 void clear(void); 01044 01066 Properties& operator<<(const Properties& prop); 01067 01068 protected: 01105 static void splitKeyValue(const std::string& str, std::string& key, 01106 std::string& value); 01107 01139 static bool split(const std::string& str, const char delim, 01140 std::vector<std::string>& value); 01141 01174 static Properties* _getNode(std::vector<std::string>& keys, 01175 std::vector<Properties*>::size_type index, 01176 const Properties* curr); 01177 01199 static void _propertiyNames(std::vector<std::string>& names, 01200 std::string curr_name, 01201 const Properties* curr); 01202 01224 static void _store(std::ostream& out, std::string curr_name, 01225 Properties* curr); 01226 01254 static std::ostream& _dump(std::ostream& out, const Properties& curr, 01255 int index); 01256 01280 static std::string indent(int index); 01281 01282 private: 01283 std::string name; 01284 std::string value; 01285 std::string default_value; 01286 Properties* root; 01287 std::vector<Properties*> leaf; 01288 const std::string m_empty; 01289 01313 friend std::ostream& operator<<(std::ostream& lhs, const Properties& rhs); 01314 01315 }; // class Properties 01316 }; // namespace coil 01317 #endif // COIL_PROPERTIES_H 01318