1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef CDSLIB_IMPL_BOUNDED_ARRAY_H
#define CDSLIB_IMPL_BOUNDED_ARRAY_H
/*
Dynamic non-growing array
Editions:
2008.03.08 Maxim.Khiszinsky Created
*/
#include <cds/details/allocator.h>
#include <vector>
#include <assert.h>
//@cond
namespace cds {
namespace details {
/// Bounded dynamic array
/**
The class template is intended for storing fixed-size sequences of objects.
Array capacity is constant and cannot be changed after creation of object of the class.
It is suitable for managing objects of non-copyable type \p T.
\par Template parameters
- \p T type of elements
- \p Allocator dynamic memory allocator class (<tt>std::allocator</tt> semantics)
*/
template <typename T, class Allocator = CDS_DEFAULT_ALLOCATOR >
class bounded_array
{
public:
typedef T value_type ; ///< value type stored in the array
typedef Allocator allocator_type ; ///< allocator type
typedef value_type * iterator ; ///< item iterator
typedef value_type const * const_iterator ; ///< item const iterator
private:
typedef cds::details::Allocator< T, allocator_type> allocator_impl;
value_type * m_arr;
const size_t m_nCapacity;
public:
/// Default ctor
explicit bounded_array(
size_t nCapacity ///< capacity
)
: m_arr( allocator_impl().NewArray( nCapacity ))
, m_nCapacity( nCapacity )
{}
~bounded_array()
{
allocator_impl().Delete( m_arr, capacity());
}
const value_type& operator []( size_t nItem ) const
{
assert( nItem < capacity());
return m_arr[nItem];
}
value_type& operator []( size_t nItem )
{
assert( nItem < capacity());
return m_arr[nItem];
}
size_t size() const noexcept
{
return capacity();
}
size_t capacity() const noexcept
{
return m_nCapacity;
}
/// Returns pointer to the first item in the array
value_type * top() noexcept
{
return m_arr;
}
/// Get begin iterator
const_iterator begin() const noexcept
{
return m_arr;
}
iterator begin() noexcept
{
return m_arr;
}
/// Get end iterator
const_iterator end() const noexcept
{
return begin() + capacity();
}
iterator end() noexcept
{
return begin() + capacity();
}
};
} // namespace details
} // namespace cds
//@endcond
#endif // #ifndef CDSLIB_IMPL_BOUNDED_ARRAY_H
|