1899
|
1 %{
|
|
2 #include <algorithm>
|
|
3 %}
|
|
4
|
|
5 //
|
|
6 // std::carray - is really an extension to the 'std' namespace.
|
|
7 //
|
|
8 // A simple fix C array wrapper, more or less as presented in
|
|
9 //
|
|
10 // "The C++ Standarf Library", by Nicolai M. Josuttis
|
|
11 //
|
|
12 // which is also derived from the example in
|
|
13 //
|
|
14 // "The C++ Programming Language", by Bjarne Stroustup.
|
|
15 //
|
|
16
|
|
17 %inline %{
|
|
18 namespace std {
|
|
19 template <class _Type, size_t _Size>
|
|
20 class carray
|
|
21 {
|
|
22 public:
|
|
23 typedef _Type value_type;
|
|
24 typedef size_t size_type;
|
|
25
|
|
26 typedef _Type * iterator;
|
|
27 typedef const _Type * const_iterator;
|
|
28
|
|
29 carray() { }
|
|
30
|
|
31 carray(const carray& c) {
|
|
32 std::copy(c.v, c.v + size(), v);
|
|
33 }
|
|
34
|
|
35 template <class _Iterator>
|
|
36 carray(_Iterator first, _Iterator last) {
|
|
37 assign(first, last);
|
|
38 }
|
|
39
|
|
40 iterator begin() { return v; }
|
|
41 iterator end() { return v + _Size; }
|
|
42
|
|
43 const_iterator begin() const { return v; }
|
|
44 const_iterator end() const { return v + _Size; }
|
|
45
|
|
46 _Type& operator[](size_t i) { return v[i]; }
|
|
47 const _Type& operator[](size_t i) const { return v[i]; }
|
|
48
|
|
49 static size_t size() { return _Size; }
|
|
50
|
|
51 template <class _Iterator>
|
|
52 void assign(_Iterator first, _Iterator last) {
|
|
53 if (std::distance(first,last) == size()) {
|
|
54 std::copy(first, last, v);
|
|
55 } else {
|
|
56 throw std::length_error("bad range length");
|
|
57 }
|
|
58 }
|
|
59
|
|
60 private:
|
|
61 _Type v[_Size];
|
|
62 };
|
|
63 }
|
|
64 %}
|