// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_wroot_base_leaf #define tools_wroot_base_leaf #ifdef TOOLS_MEM #include "../mem" #endif #include "named" #include "cids" #include "../scast" namespace tools { namespace wroot { class base_leaf : public virtual ibo { static unsigned int kNullTag() {return 0;} #ifdef TOOLS_MEM public: static const std::string& s_class() { static const std::string s_v("tools::wroot::base_leaf"); return s_v; } #endif public: static cid id_class() {return base_leaf_cid();} virtual void* cast(cid a_class) const { if(void* p = cmp_cast(this,a_class)) {return p;} else return 0; } virtual cid id_cls() const {return id_class();} public: //ibo virtual bool stream(buffer& a_buffer) const { //::printf("debug : base_leaf::stream %s\n",m_name.c_str()); //::printf("debug : m_length %d\n",m_length); //::printf("debug : m_is_range %d\n",m_is_range); //::printf("debug : m_leaf_count %lu\n",m_leaf_count); unsigned int c; if(!a_buffer.write_version(2,c)) return false; if(!Named_stream(a_buffer,m_name,m_title)) return false; if(!a_buffer.write(m_length)) return false; if(!a_buffer.write(m_length_type)) return false; uint32 fOffset = 0; if(!a_buffer.write(fOffset)) return false; if(!a_buffer.write(m_is_range)) return false; bool fIsUnsigned = false; if(!a_buffer.write(fIsUnsigned)) return false; if(m_leaf_count) { if(!a_buffer.write_object(*m_leaf_count)) return false; } else { if(!a_buffer.write(kNullTag())) return false; } if(!a_buffer.set_byte_count(c)) return false; return true; } public: virtual bool fill_buffer(buffer&) const = 0; public: base_leaf(std::ostream& a_out,const std::string& a_name,const std::string& a_title) :m_out(a_out) ,m_name(a_name) ,m_title(a_title) ,m_length(0) ,m_length_type(0) ,m_leaf_count(0) ,m_is_range(false) { #ifdef TOOLS_MEM mem::increment(s_class().c_str()); #endif } virtual ~base_leaf(){ #ifdef TOOLS_MEM mem::decrement(s_class().c_str()); #endif } protected: base_leaf(const base_leaf& a_from) :ibo(a_from) ,m_out(a_from.m_out) ,m_length(0) ,m_length_type(0) ,m_leaf_count(0) ,m_is_range(false) {} base_leaf& operator=(const base_leaf&){return *this;} public: const std::string& name() const {return m_name;} //const std::string& title() const {return m_title;} void set_title(const std::string& a_value) {m_title = a_value;} uint32 length() const {return m_length;} void set_length(uint32 a_value) {m_length = a_value;} void set_is_range(bool a_value) {m_is_range = a_value;} protected: std::ostream& m_out; protected: //Named std::string m_name; std::string m_title; uint32 m_length; // Number of fixed length elements uint32 m_length_type; // Number of bytes for this data type ibo* m_leaf_count; bool m_is_range; }; }} #endif