Silicium
vector.hpp
Go to the documentation of this file.
1 #ifndef SILICIUM_VECTOR_HPP
2 #define SILICIUM_VECTOR_HPP
3 
4 #include <silicium/config.hpp>
5 #include <boost/container/vector.hpp>
6 
7 namespace Si
8 {
9  template <class Element, class Allocator = std::allocator<Element>>
10  struct vector
11  {
12  typedef Element element_type;
13  typedef std::size_t size_type;
14  typedef typename boost::container::vector<Element, Allocator>::iterator iterator;
15  typedef typename boost::container::vector<Element, Allocator>::const_iterator const_iterator;
16 
17  vector() BOOST_NOEXCEPT
18  {
19  }
20 
21  vector(vector &&other) BOOST_NOEXCEPT
22  : m_impl(std::move(other.m_impl))
23  {
24  }
25 
26  vector &operator = (vector &&other) BOOST_NOEXCEPT
27  {
28  m_impl = std::move(other.m_impl);
29  return *this;
30  }
31 
32  vector(std::initializer_list<Element> elements)
33  //Boost 1.56 is missing the initializer_list ctor
34  : m_impl(elements.begin(), elements.end())
35  {
36  }
37 
39  public:
40 
41  vector copy() const
42  {
43  return vector{m_impl};
44  }
45 
46  bool empty() const BOOST_NOEXCEPT
47  {
48  return m_impl.empty();
49  }
50 
51  size_type size() const BOOST_NOEXCEPT
52  {
53  return m_impl.size();
54  }
55 
56  element_type *data() BOOST_NOEXCEPT
57  {
58  return m_impl.data();
59  }
60 
61  element_type const *data() const BOOST_NOEXCEPT
62  {
63  return m_impl.data();
64  }
65 
66  iterator begin() BOOST_NOEXCEPT
67  {
68  return m_impl.begin();
69  }
70 
71  const_iterator begin() const BOOST_NOEXCEPT
72  {
73  return m_impl.begin();
74  }
75 
76  iterator end() BOOST_NOEXCEPT
77  {
78  return m_impl.end();
79  }
80 
81  const_iterator end() const BOOST_NOEXCEPT
82  {
83  return m_impl.end();
84  }
85 
86  template <class ...Args>
87  void emplace_back(Args &&...args)
88  {
89  m_impl.emplace_back(std::forward<Args>(args)...);
90  }
91 
92  private:
93 
94  boost::container::vector<Element, Allocator> m_impl;
95 
96  explicit vector(boost::container::vector<Element, Allocator> impl)
97  : m_impl(std::move(impl))
98  {
99  }
100  };
101 
102  template <class Element, class Allocator>
104  {
105  return (left.size() == right.size()) && std::equal(left.begin(), left.end(), right.begin());
106  }
107 }
108 
109 #endif
std::remove_reference< T >::type && move(T &&ref)
Definition: move.hpp:10
boost::container::vector< Element, Allocator >::const_iterator const_iterator
Definition: vector.hpp:15
iterator begin() BOOST_NOEXCEPT
Definition: vector.hpp:66
vector() BOOST_NOEXCEPT
Definition: vector.hpp:17
Definition: absolute_path.hpp:352
Definition: absolute_path.hpp:19
#define SILICIUM_DISABLE_COPY(struct_name)
Definition: config.hpp:114
const_iterator begin() const BOOST_NOEXCEPT
Definition: vector.hpp:71
void emplace_back(Args &&...args)
Definition: vector.hpp:87
element_type const * data() const BOOST_NOEXCEPT
Definition: vector.hpp:61
Definition: vector.hpp:10
iterator end() BOOST_NOEXCEPT
Definition: vector.hpp:76
const_iterator end() const BOOST_NOEXCEPT
Definition: vector.hpp:81
Element element_type
Definition: vector.hpp:12
SILICIUM_USE_RESULT bool operator==(absolute_path const &left, ComparableToPath const &right)
Definition: absolute_path.hpp:169
boost::container::vector< Element, Allocator >::iterator iterator
Definition: vector.hpp:14
bool empty() const BOOST_NOEXCEPT
Definition: vector.hpp:46
vector(std::initializer_list< Element > elements)
Definition: vector.hpp:32
size_type size() const BOOST_NOEXCEPT
Definition: vector.hpp:51
element_type * data() BOOST_NOEXCEPT
Definition: vector.hpp:56
std::size_t size_type
Definition: vector.hpp:13
vector & operator=(vector &&other) BOOST_NOEXCEPT
Definition: vector.hpp:26
vector(vector &&other) BOOST_NOEXCEPT
Definition: vector.hpp:21
vector copy() const
Definition: vector.hpp:41