Main Page   Namespace List   Compound List   File List   Namespace Members   Compound Members   File Members   Examples  

DataObject.h

Go to the documentation of this file.
00001 # ifndef _DataObject_h__included__
00002 # define _DataObject_h__included__
00003 
00005 // DataXML: Utility for Storing Simple Object Data
00006 //
00007 // Component: utilities
00008 // Author   : Jakub.Moscicki@cern.ch
00009 //
00010 // CERN/IT, Geneva, 2001
00012 
00013 # include <string>
00014 # include <vector>
00015 # include <map>
00016 # include <iostream>
00017 
00018 # include <stack> /* for tree */
00019 
00020 #ifdef OLDSTREAMS
00021 # include <strstream>
00022 # define ostringstream ostrstream
00023 # define istringstream istrstream
00024 #else
00025 # include <sstream>
00026 #endif
00027 
00028 namespace DataXML
00029 {
00030 
00061 class DataObject
00062 {
00063 public:
00064 
00066   DataObject();
00067 
00069   DataObject(std::string name);
00070 
00072 
00073   std::string name() const;  
00074   void setName(std::string name);
00076 
00078 
00079 
00080   bool appendAttribute(std::string attr_name, std::string attr_val);
00081 
00083   void setAttribute(std::string attr_name, std::string attr_val);
00084 
00086   void removeAttribute(std::string attr_name);
00087 
00089   std::string getAttributeValue(std::string attr_name) const;
00091 
00093 
00095 
00096   void appendChild(const DataObject& elem);
00097 
00100   DataObject* getChild(std::string child_name);
00101 
00104   const DataObject* getChild(std::string child_name) const;
00105 
00107   DataObject* firstChild();
00108   const DataObject* firstChild() const;
00109 
00111   DataObject* lastChild();
00112   const DataObject* lastChild() const;
00113 
00115 
00116 
00118 
00119 
00120   void appendChildText(std::string text);
00121 
00123   std::string getText() const;
00125 
00126 
00128 
00129   std::vector<DataObject>& children(); 
00130   const std::vector<DataObject>& children() const;
00132 
00133 
00134 
00135 
00137 
00138   
00139   std::map<std::string,std::string>& attributes();
00140   const std::map<std::string,std::string>& attributes() const;
00142 
00143   static const DataObject& the_void_object();
00144 
00145 private:
00146 
00147   std::string m_name;
00148 
00149   std::map<std::string,std::string> m_attr;
00150   std::vector<DataObject> m_child;
00151 
00152 };
00153 
00157   DataObject TextDataObject(std::string text);
00158 
00159 
00165 template<class T>
00166 std::string to_string(T val)
00167 {
00168   std::ostringstream buf;
00169   buf << val;
00170 #ifndef BADENDS
00171   buf << std::ends;
00172 #endif
00173   std::string ret = buf.str();
00174   return ret;
00175 }
00176 
00182 template<class T>
00183 bool to_value(std::string s, T& val)
00184 {
00185   std::istringstream buf( s.c_str() );
00186   buf >> std::ws;
00187   if ( buf.eof() || (! buf.good() ) ) return false;
00188   buf >> val;
00189   return true;
00190 }
00191 
00204 class DataObjectTreeCreator
00205 {
00206 public:
00207 
00208   DataObjectTreeCreator() : m_current_obj(0), m_parent_stack(), m_root_obj(), m_finished(false) {}
00209 
00211   bool empty();
00212 
00214   bool finished();
00215 
00217   DataObject* root();
00218 
00220   DataObject* current();
00221 
00224   void createAndOpenSubObject();
00225 
00227   void backToParent();
00228   
00231   void appendTextAsSubObject();
00232   
00234   std::string current_freemarkup();
00235 
00236   void append_next_freemarkup_segment(std::string text);
00237 
00238 
00239 private:
00240   
00241   DataObject *m_current_obj; /* current data object, 0 if begin */
00242   std::stack<DataObject*> m_parent_stack; /* trace back parent objects */
00243   DataObject m_root_obj; /* root object */
00244   bool m_finished; /* true if finished*/
00245   std::string m_freemarkup_buffer;
00246 };
00247 
00248 } // namespace
00249 
00250 # endif

Generated at Tue Jan 28 15:35:28 2003 for DataXML by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001