Skip to content

Commit 17184b2

Browse files
committed
Exchanged Span for Array.
1 parent 2c37a3c commit 17184b2

File tree

12 files changed

+284
-202
lines changed

12 files changed

+284
-202
lines changed

src/array.tcc

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#pragma once
2+
3+
template <class T, size_t n>
4+
class Array {
5+
public:
6+
Array() = default;
7+
8+
/*!
9+
* Create an array using an initialiser list.
10+
*
11+
* \param data... Data.
12+
*/
13+
template <class... Ts>
14+
Array(Ts...);
15+
16+
/*!
17+
* Create an Array using a C array.
18+
*
19+
* \param arr C array.
20+
*/
21+
Array(T const (&)[n]);
22+
23+
T& operator[](size_t const);
24+
T const& operator[](size_t const) const;
25+
26+
T* begin();
27+
T* end();
28+
T const* begin() const;
29+
T const* end() const;
30+
31+
/*!
32+
* Get the number of elements.
33+
*
34+
* \return Array size.
35+
*/
36+
size_t size() const;
37+
38+
private:
39+
T arr_[n] {};
40+
};
41+
42+
43+
template <class T, size_t n>
44+
template <class... Ts>
45+
Array<T, n>::Array(Ts... data) : arr_ {data...} {}
46+
47+
template <class T, size_t n>
48+
Array<T, n>::Array(T const (&arr)[n]) {
49+
for (size_t i {0}; i < n; ++i) {
50+
arr_[i] = arr[i];
51+
}
52+
}
53+
54+
55+
template <class T, size_t n>
56+
T& Array<T, n>::operator[](size_t const idx) {
57+
return arr_[idx];
58+
}
59+
60+
template <class T, size_t n>
61+
T const& Array<T, n>::operator[](size_t const idx) const {
62+
return arr_[idx];
63+
}
64+
65+
66+
template <class T, size_t n>
67+
T* Array<T, n>::begin() {
68+
return arr_;
69+
}
70+
71+
template <class T, size_t n>
72+
T* Array<T, n>::end() {
73+
return arr_ + n;
74+
}
75+
76+
template <class T, size_t n>
77+
T const * Array<T, n>::begin() const {
78+
return arr_;
79+
}
80+
81+
template <class T, size_t n>
82+
T const* Array<T, n>::end() const {
83+
return arr_ + n;
84+
}
85+
86+
87+
template <class T, size_t n>
88+
size_t Array<T, n>::size() const {
89+
return n;
90+
}

src/read.tcc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "defs.h"
44
#include "tuple.tcc"
55
#include "vector.tcc"
6+
#include "array.tcc"
67

78
//! \defgroup read
89

@@ -67,10 +68,9 @@ inline void rpcRead(Stream& io, String* data) {
6768
template <class T>
6869
void rpcRead(Stream& io, Vector<T>* data) {
6970
size_t size;
70-
7171
rpcRead(io, &size);
72-
(*data).resize(size);
7372

73+
(*data).resize(size);
7474
for (size_t i {0}; i < (*data).size(); i++) {
7575
rpcRead(io, &(*data)[i]);
7676
}
@@ -81,15 +81,26 @@ void rpcRead(Stream& io, Vector<T>* data) {
8181
template <class T>
8282
void rpcRead(Stream& io, T** data) {
8383
size_t size;
84-
8584
rpcRead(io, &size);
86-
*data = new T[size];
8785

86+
*data = new T[size];
8887
for (size_t i {0}; i < size; i++) {
8988
rpcRead(io, *data + i);
9089
}
9190
}
9291

92+
/*! \ingroup read
93+
* \copydoc rpcRead(Stream&, T*) */
94+
template <class T, size_t n>
95+
void rpcRead(Stream& io, Array<T, n>* data) {
96+
size_t size;
97+
rpcRead(io, &size);
98+
99+
for (size_t i {0}; i < min(size, n); i++) {
100+
rpcRead(io, &(*data)[i]);
101+
}
102+
}
103+
93104
/*! \ingroup read
94105
* \copydoc rpcRead(Stream&, T*) */
95106
template <class T>

src/span.tcc

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/types.tcc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "print.tcc"
44
#include "tuple.tcc"
55
#include "vector.tcc"
6+
#include "array.tcc"
67

78
//! \defgroup types
89

@@ -165,9 +166,20 @@ void rpcTypeOf(Stream& io, Object<Membs...>& o) {
165166
* \copydoc rpcTypeOf(Stream&, bool) */
166167
template <class T>
167168
void rpcTypeOf(Stream& io, Vector<T>&) {
169+
rpcPrint(io, '[');
168170
T x {};
171+
rpcTypeOf(io, x);
172+
rpcPrint(io, ']');
173+
}
169174

175+
/*! \ingroup types
176+
* \copydoc rpcTypeOf(Stream&, bool) */
177+
template <class T, size_t n>
178+
void rpcTypeOf(Stream& io, Array<T, n>&) {
170179
rpcPrint(io, '[');
180+
size_t n_ {n};
181+
rpcPrint(io, n_);
182+
T x {};
171183
rpcTypeOf(io, x);
172184
rpcPrint(io, ']');
173185
}
@@ -176,13 +188,14 @@ void rpcTypeOf(Stream& io, Vector<T>&) {
176188
* \copydoc rpcTypeOf(Stream&, bool) */
177189
template <class T>
178190
void rpcTypeOf(Stream& io, T*) {
179-
T x {};
180-
181191
rpcPrint(io, '[');
192+
T x {};
182193
rpcTypeOf(io, x);
183194
rpcPrint(io, ']');
184195
}
185196

197+
// TODO: References to arrays can be returned, e.g., int (&test())[10] {}
198+
186199

187200
/*! \ingroup types
188201
* Determine endianness and type of `size_t`.

src/vector.tcc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ public:
2929
/*!
3030
* Create a Vector with `size` elements from a C array.
3131
*
32-
* \param data C array.
32+
* \param arr C array.
3333
*/
3434
template <size_t n>
3535
Vector(T const (&)[n]);
3636

3737
/*!
3838
* Create a Vector with `size` elements from a block of raw memory.
3939
*
40-
* \param data Pointer to data, Vector takes ownership.
40+
* \param ptr Pointer to data, Vector takes ownership.
4141
* \param size Vector size.
4242
*/
4343
Vector(T* const, size_t const);
@@ -113,14 +113,14 @@ Vector<T>::Vector(size_t const size)
113113
: size_ {size}, data_ {new T[size]} {}
114114

115115
template <class T>
116-
Vector<T>::Vector(T* const data, size_t const size)
117-
: size_ {size}, data_ {data} {}
116+
Vector<T>::Vector(T* const ptr, size_t const size)
117+
: size_ {size}, data_ {ptr} {}
118118

119119
template <class T>
120120
template <size_t n>
121-
Vector<T>::Vector(T const (&data)[n])
121+
Vector<T>::Vector(T const (&arr)[n])
122122
: size_ {n}, data_ {new T[n]} {
123-
copy_(data);
123+
copy_(arr);
124124
}
125125

126126
template <class T>

src/write.tcc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
#include "print.tcc"
44
#include "tuple.tcc"
55
#include "vector.tcc"
6+
#include "array.tcc"
67

78
//! \defgroup write
89

910

1011
/*! \ingroup write
11-
* Write a value to an stream.
12+
* Write a value to a stream.
1213
*
1314
* \param io Stream.
1415
* \param data Data.
@@ -49,6 +50,17 @@ void rpcWrite(Stream& io, Vector<T>* data) {
4950
}
5051
}
5152

53+
/*! \ingroup write
54+
* \copydoc rpcWrite(Stream&, T*) */
55+
template <class T, size_t n>
56+
void rpcWrite(Stream& io, Array<T, n>* data) {
57+
size_t size {(*data).size()};
58+
rpcWrite(io, &size);
59+
for (size_t i {0}; i < size; i++) {
60+
rpcWrite(io, &(*data)[i]);
61+
}
62+
}
63+
5264

5365
//! Recursion terminator for `rpcWrite(Tuple*)()`.
5466
inline void rpcWrite(Stream&, Tuple<>*) {}

0 commit comments

Comments
 (0)