Skip to content

Commit 57d1fc8

Browse files
committed
Construct, fill, and assign with arrays of different sizes and types.
1 parent 6e57d5e commit 57d1fc8

File tree

3 files changed

+71
-26
lines changed

3 files changed

+71
-26
lines changed

Array.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,26 @@ class Array
2424
public:
2525
Array();
2626
Array(const T &value);
27-
Array(const T (&values)[MAX_SIZE]);
27+
template <typename U, size_t N>
28+
Array(const U (&values)[N]);
29+
template <typename U, size_t N>
30+
Array(const Array<U,N> &values);
2831
T& operator[](const size_t i);
2932
T& at(const size_t i);
3033
T& front();
3134
T& back();
3235
void clear();
3336
void fill(const T &value);
34-
void fill(const T (&values)[MAX_SIZE]);
35-
void assign(const size_t n, const T &value);
36-
void assign(const size_t n, const T values[]);
37+
template <typename U, size_t N>
38+
void fill(const U (&values)[N]);
39+
template <typename U, size_t N>
40+
void fill(const Array<U,N> &values);
41+
template <typename U>
42+
void assign(const size_t n, const U &value);
43+
template <typename U, size_t N>
44+
void assign(const size_t n, const U (&values)[N]);
45+
template <typename U, size_t N>
46+
void assign(const size_t n, const Array<U,N> &values);
3747
void push_back(const T &value);
3848
void pop_back();
3949
size_t size();

ArrayDefinitions.h

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,16 @@ Array<T, MAX_SIZE>::Array(const T &value)
2626
}
2727

2828
template <typename T, size_t MAX_SIZE>
29-
Array<T, MAX_SIZE>::Array(const T (&values)[MAX_SIZE])
29+
template <typename U, size_t N>
30+
Array<T, MAX_SIZE>::Array(const U (&values)[N])
31+
{
32+
size_ = 0;
33+
fill(values);
34+
}
35+
36+
template <typename T, size_t MAX_SIZE>
37+
template <typename U, size_t N>
38+
Array<T, MAX_SIZE>::Array(const Array<U,N> &values)
3039
{
3140
size_ = 0;
3241
fill(values);
@@ -69,44 +78,55 @@ void Array<T, MAX_SIZE>::fill(const T &value)
6978
}
7079

7180
template <typename T, size_t MAX_SIZE>
72-
void Array<T, MAX_SIZE>::fill(const T (&values)[MAX_SIZE])
81+
template <typename U, size_t N>
82+
void Array<T, MAX_SIZE>::fill(const U (&values)[N])
7383
{
74-
assign(MAX_SIZE,values);
84+
assign(N,values);
7585
}
7686

7787
template <typename T, size_t MAX_SIZE>
78-
void Array<T, MAX_SIZE>::assign(const size_t n, const T &value)
88+
template <typename U, size_t N>
89+
void Array<T, MAX_SIZE>::fill(const Array<U,N> &values)
7990
{
80-
size_t assign_size = n;
81-
if ((n > size_) && (n <= MAX_SIZE))
82-
{
83-
size_ = n;
84-
}
85-
else if (n > MAX_SIZE)
86-
{
87-
size_ = MAX_SIZE;
88-
assign_size = MAX_SIZE;
89-
}
91+
assign(N,values);
92+
}
93+
94+
template <typename T, size_t MAX_SIZE>
95+
template <typename U>
96+
void Array<T, MAX_SIZE>::assign(const size_t n, const U &value)
97+
{
98+
size_t assign_size = ((n < MAX_SIZE) ? n : MAX_SIZE);
99+
size_ = assign_size;
90100
for (size_t i=0; i<assign_size; i++)
91101
{
92102
values_[i] = value;
93103
}
94104
}
95105

96106
template <typename T, size_t MAX_SIZE>
97-
void Array<T, MAX_SIZE>::assign(const size_t n, const T values[])
107+
template <typename U, size_t N>
108+
void Array<T, MAX_SIZE>::assign(const size_t n, const U (&values)[N])
98109
{
99-
size_t assign_size = n;
100-
if ((n > size_) && (n <= MAX_SIZE))
110+
size_t n_smallest = ((n < N) ? n : N);
111+
size_t assign_size = ((n_smallest < MAX_SIZE) ? n_smallest : MAX_SIZE);
112+
size_ = assign_size;
113+
for (size_t i=0; i<assign_size; i++)
101114
{
102-
size_ = n;
115+
values_[i] = values[i];
103116
}
104-
else if (n > MAX_SIZE)
117+
}
118+
119+
template <typename T, size_t MAX_SIZE>
120+
template <typename U, size_t N>
121+
void Array<T, MAX_SIZE>::assign(const size_t n, const Array<U,N> &values)
122+
{
123+
size_t n_smallest = ((n < values.size()) ? n : values.size());
124+
size_t assign_size = ((n_smallest < MAX_SIZE) ? n_smallest : MAX_SIZE);
125+
size_ = assign_size;
126+
for (size_t i=0; i<assign_size; i++)
105127
{
106-
size_ = MAX_SIZE;
107-
assign_size = MAX_SIZE;
128+
values_[i] = values[i];
108129
}
109-
memcpy((void*) values_, (void*) values, assign_size*sizeof(T));
110130
}
111131

112132
template <typename T, size_t MAX_SIZE>

examples/ArrayTester/ArrayTester.ino

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,21 @@ void setup()
8686

8787
out_of_bounds = array_doubled.at(ELEMENT_COUNT+1);
8888
Serial << "out_of_bounds:" << out_of_bounds << endl;
89+
90+
// initialize with array of different size and type
91+
Array<long,ELEMENT_COUNT*2> array_copy2(array_simple);
92+
Serial << "array_copy2:" << endl;
93+
Serial << array_copy2 << endl;
94+
Serial << "array_copy2.max_size():" << endl;
95+
Serial << array_copy2.max_size() << endl;
96+
97+
// initialize with another array instance
98+
Array<size_t,ELEMENT_COUNT*3> array_copy3(array_copy2);
99+
Serial << "array_copy3:" << endl;
100+
Serial << array_copy3 << endl;
101+
Serial << "array_copy3.max_size():" << endl;
102+
Serial << array_copy3.max_size() << endl;
103+
89104
}
90105

91106

0 commit comments

Comments
 (0)