BSON C++ API  2.5.1
uma::bson
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Array.h
Go to the documentation of this file.
1 #ifndef UMA_BSON_ARRAY_H
2 #define UMA_BSON_ARRAY_H
3 
4 #include <uma/bson/Value.h>
5 #include <uma/bson/Element.h>
6 
7 #include <Poco/SharedPtr.h>
8 #include <sstream>
9 #include <vector>
10 
11 namespace uma
12 {
13  namespace bson
14  {
29  class UMA_BSON_API Array : public Value
30  {
31  public:
33  Array() : pimpl( new ArrayImpl ) {}
34 
42  static Array fromFile( const std::string& filePath );
43 
53  static Array fromBytes( const char* bytes, const int32_t length );
54 
63  static Array fromStream( std::istream& is );
64 
72  static Array fromJson( std::istream& is );
73 
79  bool isEmpty() const { return pimpl->isEmpty(); }
80 
87  size_t size() const { return pimpl->size(); }
88 
90  typedef std::vector<Element>::const_iterator ConstantIterator;
91 
99  ConstantIterator begin() const { return pimpl->begin(); }
100 
108  ConstantIterator end() const { return pimpl->end(); }
109 
118  const Element& at( const size_t index ) const { return pimpl->at( index ); }
119 
128  Element& at( const size_t index ) { return pimpl->at( index ); }
129 
142  Element& operator [] ( const size_t index );
143 
145  const Element& operator [] ( const size_t index ) const { return at( index ); }
146 
159  Array& add( const Element& element, const int index = -1 )
160  {
161  pimpl->add( element, index );
162  return *this;
163  }
164 
172  template <typename DataType>
173  Array& add( const DataType& value )
174  {
175  std::stringstream ss;
176  ss << size();
177  Element e( ss.str(), value );
178  return add( e );
179  }
180 
182  template <typename DataType>
183  Array& operator << ( const DataType& value ) { return add( value ); }
184 
193  Element remove( const int index ) { return pimpl->remove( index ); }
194 
201  void toBson( std::ostream& os ) const;
202 
216  void toJson( std::ostream& os, bool prettyPrint = false ) const;
217 
234  Array clone() const;
235 
241  int32_t getSize() const { return pimpl->getSize(); }
242 
249  Value::Type getType() const { return Value::Array; }
250 
251  private:
252  class ArrayImpl
253  {
254  public:
255  bool isEmpty() const { return fields.empty(); }
256  size_t size() const { return fields.size(); }
257 
258  Array::ConstantIterator begin() const { return fields.begin(); }
259  Array::ConstantIterator end() const { return fields.end(); }
260 
261  Element& at( const size_t index ) { return fields.at( index ); }
262  const Element& at( const size_t index ) const { return fields.at( index ); }
263 
264  void add( const Element& element, const int index = -1 );
265 
266  Element remove( const int index );
267 
268  int32_t getSize() const;
269 
270  private:
271  typedef std::vector<Element> Container;
272  Container fields;
273  };
274 
275  typedef Poco::SharedPtr<ArrayImpl> PimplPtr;
276  PimplPtr pimpl;
277  };
278 
292  UMA_BSON_API bool operator == ( const Array& lhs, const Array& rhs );
293 
295  inline bool operator != ( const Array& lhs, const Array& rhs )
296  {
297  return ! ( lhs == rhs );
298  }
299 
300  } // namespace bson
301 } // namespace uma
302 
303 #endif // UMA_BSON_ARRAY_H