3 #ifndef OSL_CONTAINER_H 4 #define OSL_CONTAINER_H 12 #include <type_traits> 14 #define CONSERVATIVE_PLAYER_ACCESS 18 template <
typename T,
size_t Capacity>
23 typedef typename std::remove_cv<T>::type
T_simple;
36 #ifndef CONSERVATIVE_PLAYER_ACCESS 38 return *((T*)((
char *)&elements[0] +
39 (p & ((
char *)&elements[1]-(
char *)&elements[0]))));
46 #ifndef CONSERVATIVE_PLAYER_ACCESS 47 return *((T*)((
char *)&elements[0] +
48 (p & ((
char *)&elements[1]-(
char *)&elements[0]))));
63 typedef typename std::array<T,Capacity>::iterator
iterator;
64 iterator
begin() {
return array.begin(); }
65 iterator
end() {
return array.end(); }
71 template <class T2, class = typename std::enable_if<!std::is_convertible<T2,T_simple>::value>::type>
72 void fill(
const T2& value=T2()) {
76 static size_t size() {
return Capacity; }
78 const_iterator
begin()
const {
return array.begin(); }
79 const_iterator
end()
const {
return array.end(); }
80 const_iterator
cbegin()
const {
return array.cbegin(); }
81 const_iterator
cend()
const {
return array.cend(); }
84 return array == other.
array;
87 T&
front() {
return array.front(); }
88 T&
back() {
return array.back(); }
89 const T&
front()
const {
return array.front(); }
90 const T&
back()
const {
return array.back(); }
94 template <
typename T,
size_t Capacity1,
size_t Capacity2>
97 template <
typename T,
size_t Capacity1,
size_t Capacity2,
size_t Capacity3>
102 template <
typename T>
107 #if ! (defined NDEBUG && defined MINIMAL) 112 : ptr(*vPtr_), vPtr(vPtr_)
113 #if ! (defined NDEBUG && defined MINIMAL)
119 assert( *vPtr == ptr );
124 assert( *vPtr == ptr );
135 template <
typename T,
size_t Capacity>
149 return *
reinterpret_cast<const array_t*
>(&relements);
152 return *
reinterpret_cast<array_t*
>(&relements);
167 template <
class RangeIterator>
169 : ptr(&(elements()[0])) {
170 push_back(first, last);
184 iterator it=std::copy(&(rhs.
elements()[0]),
195 return elements()[i];
198 iterator
begin() {
return &elements()[0]; }
199 iterator
end() {
return static_cast<iterator
>(ptr); }
205 assert(
size() < Capacity);
209 template <
class RangeIterator>
210 void push_back(
const RangeIterator& first,
const RangeIterator& last);
217 ptr= &(elements()[0]);
222 while (
size() < new_length)
224 if (new_length <
size()) {
226 ptr= &(elements()[new_length]);
230 const iterator new_end = std::remove(
begin(),
end(), e);
238 iterator last = std::unique(
begin(),
end());
249 return elements()[i];
251 const_iterator
begin()
const {
return &elements()[0]; }
252 const_iterator
end()
const {
return ptr; }
255 const T&
back()
const {
return *(
end() - 1); }
257 bool isMember(
const T& e, const_iterator first, const_iterator last)
const {
258 return std::find(first, last, e) != last;
264 return {&ptr, &*
begin()+Capacity};
267 template <
typename T,
size_t C>
inline 272 template <
typename T,
size_t C>
inline 275 return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end());
280 template <
typename T,
size_t Capacity>
281 template <
class RangeIterator>
284 iterator insert_point =
end();
285 std::uninitialized_copy(first, last, insert_point);
287 assert(
size() <= Capacity);
const_iterator end() const
~FixedCapacityVectorPushBack()
void push_back(const T &e)
array_t::iterator iterator
const PtypeO PTYPEO_EDGE __attribute__((unused))
use raw memory copy instead of placement new not to test a given pointer is null
const_iterator begin() const
const array_t & elements() const
FixedCapacityVector & operator=(FixedCapacityVector const &rhs)
const_iterator cbegin() const
std::ostream & operator<<(std::ostream &os, Player player)
detail::FixedCapacityVectorPushBack< T > pushBackHelper()
bool isMember(const T &e, const_iterator first, const_iterator last) const
array_t::const_iterator const_iterator
const_iterator end() const
std::array< T, Capacity > array
void fill(const T2 &value=T2())
FixedCapacityVector(size_t size)
void resize(size_t new_length)
array_t::value_type value_type
bool operator==(const CArray &other) const
std::array< T, Capacity >::const_iterator const_iterator
constexpr int playerToIndex(Player player)
CArray< int64_t,(sizeof(T[Capacity])+sizeof(int64_t) -1)/sizeof(int64_t)> relements
bool operator<(Offset l, Offset r)
const_iterator cend() const
static const unsigned int MaxUniqMoves
一局面辺りの合法手の最大値 重複して手を生成することがある場合は,600では不足かもしれない ...
void construct(T1 *ptr, const T2 &value, typename boost::enable_if< detail::BitCopyTraits< T1 > >::type *=0)
void push_back(const T &e)
PtypeO
Player + Ptype [-15, 15] PtypeO の O は Owner の O.
void fill(const T_simple &value=T_simple())
FixedCapacityVector(FixedCapacityVector const &rhs)
FixedCapacityVector(const RangeIterator &first, const RangeIterator &last)
bool isMember(const T &e) const
std::array< T, Capacity >::iterator iterator
FixedCapacityVectorPushBack(T **vPtr_, T *limit_)
std::remove_cv< T >::type T_simple
unsigned int ptypeOIndex(PtypeO ptypeo)
const_iterator begin() const