1 // file      : xsd/cxx/tree/list.hxx
2 // copyright : Copyright (c) 2005-2017 Code Synthesis Tools CC
3 // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file
4 
5 #ifndef XSD_CXX_TREE_LIST_HXX
6 #define XSD_CXX_TREE_LIST_HXX
7 
8 #include <string>
9 
10 #include <xercesc/dom/DOMAttr.hpp>
11 #include <xercesc/dom/DOMElement.hpp>
12 
13 #include <xsd/cxx/tree/elements.hxx>
14 #include <xsd/cxx/tree/istream-fwd.hxx> // tree::istream
15 #include <xsd/cxx/tree/containers.hxx>  // fundamental_p, sequence
16 
17 namespace xsd
18 {
19   namespace cxx
20   {
21     namespace tree
22     {
23       // Class template for xsd:list mapping. Based on the sequence
24       // template.
25       //
26       template <typename T,
27                 typename C,
28                 schema_type::value ST = schema_type::other,
29                 bool fund = fundamental_p<T>::r>
30       class list;
31 
32 
33       //
34       //
35       template <typename T, typename C, schema_type::value ST>
36       class list<T, C, ST, false>: public sequence<T>
37       {
38       public:
39         explicit
list(container * c=0)40         list (container* c = 0)
41             : sequence<T> (c)
42         {
43         }
44 
list(typename sequence<T>::size_type n,const T & x,container * c=0)45         list (typename sequence<T>::size_type n,
46               const T& x,
47               container* c = 0)
48             : sequence<T> (n, x, c)
49         {
50         }
51 
52         template<typename I>
list(const I & b,const I & e,container * c=0)53         list (const I& b, const I& e, container* c = 0)
54             : sequence<T> (b, e, c)
55         {
56         }
57 
58         template <typename S>
59         list (istream<S>&, flags = 0, container* c = 0);
60 
list(const list<T,C,ST,false> & l,flags f=0,container * c=0)61         list (const list<T, C, ST, false>& l, flags f = 0, container* c = 0)
62             : sequence<T> (l, f, c)
63         {
64         }
65 
66       public:
67         list (const xercesc::DOMElement&, flags = 0, container* c = 0);
68 
69         list (const xercesc::DOMAttr&, flags = 0, container* c = 0);
70 
71         list (const std::basic_string<C>&,
72               const xercesc::DOMElement*,
73               flags = 0,
74               container* c = 0);
75 
76       private:
77         void
78         init (const std::basic_string<C>&,
79               const xercesc::DOMElement*,
80               flags);
81       };
82 
83 
84       //
85       //
86       template <typename T, typename C, schema_type::value ST>
87       class list<T, C, ST, true>: public sequence<T>
88       {
89       public:
90         explicit
list(container * c=0)91         list (container* c = 0)
92             : sequence<T> (c)
93         {
94         }
95 
96         explicit
list(typename sequence<T>::size_type n,const T & x,container * c=0)97         list (typename sequence<T>::size_type n, const T& x, container* c = 0)
98             : sequence<T> (n, x, c)
99         {
100         }
101 
102         template<typename I>
list(const I & b,const I & e,container * c=0)103         list (const I& b, const I& e, container* c = 0)
104             : sequence<T> (b, e, c)
105         {
106         }
107 
108         template <typename S>
109         list (istream<S>&, flags = 0, container* c = 0);
110 
list(const list<T,C,ST,true> & l,flags f=0,container * c=0)111         list (const list<T, C, ST, true>& l, flags f = 0, container* c = 0)
112             : sequence<T> (l, f, c)
113         {
114         }
115 
116       public:
117         list (const xercesc::DOMElement&, flags = 0, container* c = 0);
118 
119         list (const xercesc::DOMAttr&, flags = 0, container* c = 0);
120 
121         list (const std::basic_string<C>&,
122               const xercesc::DOMElement*,
123               flags = 0,
124               container* c = 0);
125 
126       private:
127         void
128         init (const std::basic_string<C>&, const xercesc::DOMElement*);
129       };
130     }
131   }
132 }
133 
134 #endif // XSD_CXX_TREE_LIST_HXX
135