C++ container-like classes (vector
, array
, deque
, map
etc.) for Arduino which cannot use STL
ArxContainer
is C++ container-like classes for Arduino- Containers in this library is defined inside namespace
arx::stdx
instad ofstd
(e.g.arx::stdx::vector
) - All of the functions is not supported currently
- Containers in this library is defined inside namespace
- If standard libraries are available, automatically use
std
version instead ofarx::stdx
version
vector
array
map
(pair
)deque
arx::stdx
version of containers are enabled only if you use following architecture.
In other borads, arx::stdx
version is disabled and standard libraries (std
version) will be imported (because they can use them).
- AVR (Uno, Nano, Mega, etc.)
- MEGAAVR (Uno WiFi, Nano Ecery, etc.)
- SAM (Due)
// initialize with initializer_list
std::vector<int> vs {1, 2, 3};
// this is same as
// arx::stdx::vector<int> vs {1, 2, 3};
// add contents
for (size_t i = 4; i <= 5; ++i)
vs.push_back(i);
// index access
for (size_t i = 0; i < vs.size(); ++i)
Serial.println(vs[i]);
// range-based access
for (const auto& v : vs)
Serial.println(v);
// initialize with initializer_list
std::array<int, 3> arr {1, 2, 3};
// this is same as
// arx::stdx::array<int, 3> arr {1, 2, 3};
// fill
arr.fill(123);
// index access
for (size_t i = 0; i < arr.size(); ++i)
Serial.println(arr[i]);
// range-based access
for (const auto& a : arr)
Serial.println(a);
// initialize with initializer_list
std::map<String, int> mp {{"one", 1}, {"two", 2}};
// this is same as
// arx::stdx::map<String, int> mp {{"one", 1}, {"two", 2}};
// add contents
mp.insert("three", 3);
mp["four"] = 4;
// range based access
for (const auto& m : mp)
{
Serial.print("{");
Serial.print(m.first); Serial.print(",");
Serial.print(m.second);
Serial.println("}");
}
// key access
Serial.print("one = "); Serial.println(mp["one"]);
Serial.print("two = "); Serial.println(mp["two"]);
Serial.print("three = "); Serial.println(mp["three"]);
Serial.print("four = "); Serial.println(mp["four"]);
// initialize with initializer_list
std::deque<int> dq {1, 2, 3};
// this is same as
// arx::stdx::deque<int> dq {1, 2, 3};
// add contents
for (int i = 4; i <= 5; ++i)
dq.push_back(i);
// index access
for (int i = 0; i < dq.size(); ++i)
Serial.print(dq[i]);
ArxContainer
is C++ container-like classes for Arduino.
This library is based on arx::RingBuffer
and arx::stdx::xxxx
is limited-size container.
arx::RingBuffer
can be used as:
ArxRingBuffer<uint8_t, 4> buffer;
buffer.push(1);
buffer.push(2);
buffer.push(3);
for(size_t i = 0; i < buffer.size(); ++i)
Serial.println(buffer[i]);
buffer.pop();
for(auto& b : buffer)
Serial.println(b);
arx::stdx::xxxx
are derived from RingBuffer
and defined as:
namespace arx {
namespace stdx {
template <typename T, size_t N = ARX_VECTOR_DEFAULT_SIZE>
struct vector : public RingBuffer<T, N>
template <typename T, size_t N>
struct array : public RingBuffer<T, N>
template <class Key, class T, size_t N = ARX_MAP_DEFAULT_SIZE>
struct map : public RingBuffer<pair<Key, T>, N>
template <typename T, size_t N = ARX_DEQUE_DEFAULT_SIZE>
struct deque : public RingBuffer<T, N>
}
}
So range-based loop cannot be applyed to arx::stdx::deque
(iterator is not continuous because it is based on RingBuffer
).
Global default size of container can be changed by defining these macros before #include <ArxContainer.h>
.
#define ARX_VECTOR_DEFAULT_SIZE XX // default: 16
#define ARX_MAP_DEFAULT_SIZE XX // default: 16
#define ARX_DEQUE_DEFAULT_SIZE XX // default: 16
Or you can change each container size by template argument.
arx::stdx::vector<int, 3> vs;
arx::stdx::map<String, int, 4> ms;
arx::stdx::deque<int, 5> ds;
This library will be updated if I want to use more container interfaces on supported boards shown above. PRs are welcome!
MIT