// file : xsd/cxx/tree/types.txx // copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #include #include #include // XSD_CXX11 #ifdef XSD_CXX11 # include // std::unique_ptr #else # include #endif #include namespace xsd { namespace cxx { namespace tree { // string // template string* string:: _clone (flags f, container* c) const { return new string (*this, f, c); } // normalized_string // template normalized_string* normalized_string:: _clone (flags f, container* c) const { return new normalized_string (*this, f, c); } // token // template token* token:: _clone (flags f, container* c) const { return new token (*this, f, c); } // nmtoken // template nmtoken* nmtoken:: _clone (flags f, container* c) const { return new nmtoken (*this, f, c); } // nmtokens // template nmtokens* nmtokens:: _clone (flags f, container* c) const { return new nmtokens (*this, f, c); } // name // template name* name:: _clone (flags f, container* c) const { return new name (*this, f, c); } // ncname // template ncname* ncname:: _clone (flags f, container* c) const { return new ncname (*this, f, c); } // language // template language* language:: _clone (flags f, container* c) const { return new language (*this, f, c); } // identity_impl // template bool identity_impl:: before (const identity& y) const { return id_ < static_cast (y).id_; } template void identity_impl:: throw_duplicate_id () const { throw duplicate_id (id_); } // id // template id* id:: _clone (flags f, container* c) const { return new id (*this, f, c); } template id& id:: operator= (C c) { unregister_id (); base () = c; register_id (); return *this; } template id& id:: operator= (const C* s) { unregister_id (); base () = s; register_id (); return *this; } template id& id:: operator= (const std::basic_string& s) { unregister_id (); base () = s; register_id (); return *this; } template id& id:: operator= (const id& x) { unregister_id (); base () = x; register_id (); return *this; } template void id:: _container (container* c) { B::_container (c); register_id (); } template void id:: register_id () { container* r (this->_root ()); if (r != 0 && !this->empty ()) r->_register_id (identity_, this->_container ()); } template void id:: unregister_id () { container* r (this->_root ()); if (r != 0 && !this->empty ()) r->_unregister_id (identity_); } // idref // template idref* idref:: _clone (flags f, container* c) const { return new idref (*this, f, c); } template const _type* idref:: get_ () const { if (!this->empty () && this->_container () != 0) { return this->_root ()->_lookup_id (identity_); } else return 0; } template _type* idref:: get_ () { if (!this->empty () && this->_container () != 0) { return this->_root ()->_lookup_id (identity_); } else return 0; } template void idref:: true_ () { } // idrefs // template idrefs* idrefs:: _clone (flags f, container* c) const { return new idrefs (*this, f, c); } // uri // template uri* uri:: _clone (flags f, container* c) const { return new uri (*this, f, c); } // qname // template qname* qname:: _clone (flags f, container* c) const { return new qname (*this, f, c); } // base64_binary // template base64_binary:: base64_binary (size_t size) : buffer (size) { } template base64_binary:: base64_binary (size_t size, size_t capacity) : buffer (size, capacity) { } template base64_binary:: base64_binary (const void* data, size_t size) : buffer (data, size) { } template base64_binary:: base64_binary (const void* data, size_t size, size_t capacity) : buffer (data, size, capacity) { } template base64_binary:: base64_binary (void* data, size_t size, size_t capacity, bool own) : buffer (data, size, capacity, own) { } template base64_binary* base64_binary:: _clone (flags f, container* c) const { return new base64_binary (*this, f, c); } template std::basic_string base64_binary:: encode () const { // Cannot use 'using namespace' because of MSXML conflict. // using xercesc::Base64; std::basic_string str; XMLSize_t n; xml::std_memory_manager mm; #ifdef XSD_CXX11 std::unique_ptr r ( #else auto_array r ( #endif Base64::encode ( reinterpret_cast (this->data ()), static_cast (this->size ()), &n, &mm), mm); if (r) { str.reserve (n + 1); str.resize (n); for (XMLSize_t i (0); i < n; ++i) str[i] = C (r[i]); } else { //@@ throw } return str; } template void base64_binary:: decode (const XMLCh* src) { // Cannot use 'using namespace' because of MSXML conflict. // using xercesc::Base64; xml::std_memory_manager mm; XMLSize_t size; #ifdef XSD_CXX11 std::unique_ptr data ( #else auto_array data ( #endif Base64::decodeToXMLByte (src, &size, &mm, Base64::Conf_RFC2045), mm); if (data) { buffer tmp (data.get (), size, size, true); data.release (); this->swap (tmp); // g++ 4.1 likes it qualified, not sure why. } else { //@@ throw } } // hex_binary // template hex_binary:: hex_binary (size_t size) : buffer (size) { } template hex_binary:: hex_binary (size_t size, size_t capacity) : buffer (size, capacity) { } template hex_binary:: hex_binary (const void* data, size_t size) : buffer (data, size) { } template hex_binary:: hex_binary (const void* data, size_t size, size_t capacity) : buffer (data, size, capacity) { } template hex_binary:: hex_binary (void* data, size_t size, size_t capacity, bool own) : buffer (data, size, capacity, own) { } template hex_binary* hex_binary:: _clone (flags f, container* c) const { return new hex_binary (*this, f, c); } template std::basic_string hex_binary:: encode () const { std::basic_string str; const char tab[] = "0123456789ABCDEF"; if (size_t n = this->size ()) { str.reserve (2 * n + 1); str.resize (2 * n); for (size_t i (0); i < n; ++i) { unsigned char byte ( static_cast (*(this->data () + i))); unsigned char h (byte >> 4); unsigned char l (byte & 0x0F); str[2 * i] = C (tab[h]); str[2 * i + 1] = C (tab[l]); } } return str; } namespace bits { inline unsigned char hex_decode (XMLCh c) { unsigned char r (0xFF); if (c >= '0' && c <= '9') r = static_cast (c - '0'); else if (c >= 'A' && c <= 'F') r = static_cast (10 + (c - 'A')); else if (c >= 'a' && c <= 'f') r = static_cast (10 + (c - 'a')); return r; } } template void hex_binary:: decode (const XMLCh* src) { size_t src_n (xercesc::XMLString::stringLen (src)); if (src_n % 2 != 0) return; // @@ throw size_t n (src_n / 2); buffer tmp (n); for (size_t i (0); i < n; ++i) { unsigned char h (bits::hex_decode (src[2 * i])); unsigned char l (bits::hex_decode (src[2 * i + 1])); if (h == 0xFF || l == 0xFF) return; //@@ throw tmp.data()[i] = (h << 4) | l; } this->swap (tmp); // g++ 4.1 likes it qualified, not sure why. } // entity // template entity* entity:: _clone (flags f, container* c) const { return new entity (*this, f, c); } // entities // template entities* entities:: _clone (flags f, container* c) const { return new entities (*this, f, c); } } } }