This file is indexed.

/usr/include/osl/container.h is in libosl-dev 0.8.0-1.4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
/* carray.h
 */
#ifndef OSL_CONTAINER_H
#define OSL_CONTAINER_H
#include "osl/basic_type.h"
#include "osl/config.h"
#include "osl/bits/construct.h"
#include <algorithm>
#include <cstddef>
#include <cassert>
#include <array>
#include <type_traits>

#define CONSERVATIVE_PLAYER_ACCESS

namespace osl
{
  template <typename T, size_t Capacity>
  class CArray
  {
  public:
    std::array<T,Capacity> array;
    typedef typename std::remove_cv<T>::type T_simple;

    T& operator[] (size_t i) {
      assert(i < Capacity);
      return array[i];
    }
    T const& operator[] (size_t i) const {
      assert(i < Capacity);
      return array[i];
    }

    T& operator[] (Player p) {
      assert(1 < Capacity);
#ifndef CONSERVATIVE_PLAYER_ACCESS
      // equivalent to operator[](playerToIndex(p))
      return *((T*)((char *)&elements[0] + 
		    (p & ((char *)&elements[1]-(char *)&elements[0]))));
#else
      return operator[](playerToIndex(p));
#endif
    }
    const T& operator[] (Player p) const {
      assert(1 < Capacity);
#ifndef CONSERVATIVE_PLAYER_ACCESS
      return *((T*)((char *)&elements[0] + 
		    (p & ((char *)&elements[1]-(char *)&elements[0]))));
#else
      return operator[](playerToIndex(p));
#endif
    }
    T& operator[] (PtypeO ptypeo) {
      assert(PTYPEO_SIZE <= (int)Capacity);
      return operator[](ptypeOIndex(ptypeo));
    }
    const T& operator[] (PtypeO ptypeo) const {
      assert(PTYPEO_SIZE <= (int)Capacity);
      return operator[](ptypeOIndex(ptypeo));
    }

    typedef T value_type;
    typedef typename std::array<T,Capacity>::iterator iterator;
    iterator begin() { return array.begin(); }
    iterator end() { return array.end(); }

    void fill(const T_simple& value=T_simple()) {
      array.fill(value);
    }
    // for nested CArray
    template <class T2, class = typename std::enable_if<!std::is_convertible<T2,T_simple>::value>::type>
    void fill(const T2& value=T2()) {
      for (auto& a:array)
	a.fill(value);
    }
    static size_t size() { return Capacity; }
    typedef typename std::array<T,Capacity>::const_iterator const_iterator;
    const_iterator begin() const { return array.begin(); }
    const_iterator end()   const { return array.end(); }
    const_iterator cbegin() const { return array.cbegin(); }
    const_iterator cend()   const { return array.cend(); }

    bool operator==(const CArray& other) const {
      return array == other.array;
    }
    
    T& front() { return array.front(); }
    T& back() { return array.back(); }
    const T& front() const { return array.front(); }
    const T& back() const { return array.back(); }
  };

  
  template <typename T, size_t Capacity1, size_t Capacity2>
  using CArray2d = CArray<CArray<T,Capacity2>,Capacity1>;

  template <typename T, size_t Capacity1, size_t Capacity2, size_t Capacity3>
  using CArray3d = CArray<CArray2d<T,Capacity2,Capacity3>,Capacity1>;
  
  namespace detail 
  {
    template <typename T>
    class FixedCapacityVectorPushBack
    {
      T *ptr;
      T **vPtr;
#if ! (defined NDEBUG && defined MINIMAL)
      T *limit;
#endif
    public:
      FixedCapacityVectorPushBack(T** vPtr_, T* limit_)
	: ptr(*vPtr_), vPtr(vPtr_)
#if ! (defined NDEBUG && defined MINIMAL)
	,limit(limit_)
#endif
	{
	}
      ~FixedCapacityVectorPushBack() {
	assert( *vPtr == ptr );
	*vPtr = ptr;
      }
      void push_back(const T& e) {
	assert(ptr < limit);
	assert( *vPtr == ptr );
	if(misc::detail::BitCopyTraits<T>::value)
	  *ptr++ = e;
	else
	  misc::construct(ptr++,e);
#ifndef NDEBUG
	(*vPtr)++;
#endif
      }
    };
  } // namespace deteail
  template <typename T, size_t Capacity>
  class FixedCapacityVector
  {
  protected:
    struct Array : public CArray<T, Capacity> {}
#ifdef __GNUC__
    __attribute__((__may_alias__))
#endif
    ;
    typedef Array array_t;
    T* ptr;
    CArray<int64_t, (sizeof(T[Capacity])+sizeof(int64_t)-1)/sizeof(int64_t)> relements;
  private:
    const array_t &elements() const {
      return *reinterpret_cast<const array_t*>(&relements);
    }
    array_t &elements() {
      return *reinterpret_cast<array_t*>(&relements);
    }
  public:
    typedef typename array_t::value_type value_type;
    typedef typename array_t::iterator iterator;
    typedef typename array_t::const_iterator const_iterator;
    
    FixedCapacityVector() : ptr(&(elements()[0])) {}
    explicit FixedCapacityVector(size_t size) : ptr(&(elements()[0]))  {
      resize(size);
    }
    FixedCapacityVector(FixedCapacityVector const& rhs) {
      ptr= &*begin()+rhs.size();
      std::uninitialized_copy(rhs.begin(),rhs.end(),begin());
    }
    template <class RangeIterator>
    FixedCapacityVector(const RangeIterator& first, const RangeIterator& last)
      : ptr(&(elements()[0])) {
      push_back(first, last);
    }
    ~FixedCapacityVector()  {
      misc::destroy(begin(),end());
    }
    FixedCapacityVector& operator=(FixedCapacityVector const& rhs) {
      if (this == &rhs)
	return *this;
      
      if(size()>rhs.size()) {
	iterator it=std::copy(rhs.begin(),rhs.end(),begin());
	misc::destroy(it,end());
      }
      else {
	iterator it=std::copy(&(rhs.elements()[0]),
			      &(rhs.elements()[0])+size(),begin());
	std::uninitialized_copy(&(rhs.elements()[0])+size(),
				&(rhs.elements()[0])+rhs.size(),it);
      }
      ptr= &*begin()+rhs.size();
      return *this;
    }

    T& operator[] (size_t i) {
      assert(i <= size());
      return elements()[i];
    }

    iterator begin() {  return &elements()[0]; }
    iterator end() { return static_cast<iterator>(ptr); }

    T& front() { return *begin(); }
    T& back() { return *(end() - 1); }

    void push_back(const T& e) {
      assert(size() < Capacity);
      misc::construct(ptr,e);
      ++ptr;
    }
    template <class RangeIterator>
    void push_back(const RangeIterator& first, const RangeIterator& last);
    void pop_back() { 
      --ptr;
      misc::destroy(ptr+1);
    }
    void clear() { 
      size_t s=size();
      ptr= &(elements()[0]);
      // 該当する部分のdestructorを呼ぶ
      misc::destroy(begin(),begin()+(int)s);
    }
    void resize(size_t new_length) {
      while (size() < new_length)
	push_back(T());
      if (new_length < size()) {
	misc::destroy(begin()+(int)new_length,end());
	ptr= &(elements()[new_length]);
      }
    }
    void erase(const T& e) {
      const iterator new_end = std::remove(begin(), end(), e);
      ptr= &*new_end;
      misc::destroy(new_end,end());
    }

    /** 重複する要素を取り除く */
    void unique() {
      std::sort(begin(),end());
      iterator last = std::unique(begin(), end());
      ptr = &*last;
      misc::destroy(last,end());
    }

    size_t size() const { return ptr-&*begin(); }
    bool empty() const { return ptr==&*begin(); }
    size_t capacity() const { return Capacity; }

    T const& operator[] (size_t i) const {
      assert(i < size());
      return elements()[i];
    }
    const_iterator begin() const { return &elements()[0]; }
    const_iterator end()   const { return ptr; }

    const T& front() const { return *begin(); }
    const T& back() const { return *(end() - 1); }
    
    bool isMember(const T& e, const_iterator first, const_iterator last) const {
      return std::find(first, last, e) != last;
    }
    bool isMember(const T& e) const {
      return isMember(e, begin(), end());
    }
    detail::FixedCapacityVectorPushBack<T> pushBackHelper() {
      return {&ptr, &*begin()+Capacity};
    }
  };
  template <typename T, size_t C> inline
  bool operator==(const FixedCapacityVector<T,C>& l, const FixedCapacityVector<T,C>& r) 
  {
    return l.size() == r.size() && std::equal(l.begin(), l.end(), r.begin());
  }
  template <typename T, size_t C> inline
  bool operator<(const FixedCapacityVector<T,C>& l, const FixedCapacityVector<T,C>& r) 
  {
    return std::lexicographical_compare(l.begin(), l.end(), r.begin(), r.end());
  }
  using detail::FixedCapacityVectorPushBack;
} // namespace osl

template <typename T, size_t Capacity>
template <class RangeIterator>
void osl::FixedCapacityVector<T,Capacity>::push_back(const RangeIterator& first, const RangeIterator& last)
{
  iterator insert_point = end();
  std::uninitialized_copy(first, last, insert_point);
  ptr += last-first;
  assert(size() <= Capacity);
}

namespace osl
{
  class MoveVector : public FixedCapacityVector<Move,Move::MaxUniqMoves>
  {
  public:
  };
  std::ostream& operator<<(std::ostream& os,MoveVector const& mv);
  bool operator<(const MoveVector& l, const MoveVector& r);

  enum { CheckOrEscapeMaxUniqMoves = Move::MaxUniqMoves/4 }; // 150
  class CheckMoveVector : public FixedCapacityVector<Move,CheckOrEscapeMaxUniqMoves> 
  {
  };

  class PieceVector : public FixedCapacityVector<Piece,Piece::SIZE>
  {
  public:
    /**
     * 駒の価値の小さい順に並び替える.
     * 成っているかに関わらず 歩香桂銀金角飛王
     */
    void sortByBasic();
    /**
     * 駒の価値の大きい順に並び替える. 成りを考慮.
     * 王龍馬...
     */
    void sortByPtype();
  };
  std::ostream& operator<<(std::ostream& os,const PieceVector&);

  class PtypeOSquareVector
    : public FixedCapacityVector<std::pair<PtypeO,Square>,Piece::SIZE>
  {
  public:
    /**
     * 駒の価値の小さい順に並び替える
     */
    void sort();

    struct PtypeOSquareLessThan;
  };
}

#endif /* OSL_CONTAINER_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End: