From 33922e9dca722936ba0650a310543612da058b65 Mon Sep 17 00:00:00 2001 From: Hideaki Tai Date: Wed, 4 Oct 2023 16:04:37 +0900 Subject: [PATCH] feat: add library dependencies --- .github/workflows/build.yml | 8 + Artnet/util/ArxContainer/ArxContainer.h | 769 ------------------ .../ArxContainer/ArxContainer/has_include.h | 30 - .../ArxContainer/has_libstdcplusplus.h | 35 - .../ArxContainer/initializer_list.h | 32 - .../ArxContainer/replace_minmax_macros.h | 35 - Artnet/util/ArxContainer/LICENSE | 21 - Artnet/util/ArxContainer/README.md | 194 ----- Artnet/util/ArxContainer/library.json | 18 - Artnet/util/ArxContainer/library.properties | 9 - Artnet/util/ArxTypeTraits/ArxTypeTraits.h | 38 - .../ArxTypeTraits/ArxTypeTraits/functional.h | 165 ---- .../ArxTypeTraits/ArxTypeTraits/has_include.h | 30 - .../ArxTypeTraits/has_libstdcplusplus.h | 35 - .../ArxTypeTraits/initializer_list.h | 30 - .../ArxTypeTraits/replace_minmax_macros.h | 35 - .../util/ArxTypeTraits/ArxTypeTraits/tuple.h | 82 -- .../ArxTypeTraits/ArxTypeTraits/type_traits.h | 638 --------------- Artnet/util/ArxTypeTraits/LICENSE | 21 - Artnet/util/ArxTypeTraits/README.md | 117 --- Artnet/util/ArxTypeTraits/library.json | 18 - Artnet/util/ArxTypeTraits/library.properties | 9 - ArtnetETH.h | 4 +- ArtnetEther.h | 4 +- ArtnetNativeEther.h | 4 +- ArtnetWiFi.h | 4 +- README.md | 7 +- library.json | 7 +- library.properties | 1 + 29 files changed, 28 insertions(+), 2372 deletions(-) delete mode 100644 Artnet/util/ArxContainer/ArxContainer.h delete mode 100644 Artnet/util/ArxContainer/ArxContainer/has_include.h delete mode 100644 Artnet/util/ArxContainer/ArxContainer/has_libstdcplusplus.h delete mode 100644 Artnet/util/ArxContainer/ArxContainer/initializer_list.h delete mode 100644 Artnet/util/ArxContainer/ArxContainer/replace_minmax_macros.h delete mode 100644 Artnet/util/ArxContainer/LICENSE delete mode 100644 Artnet/util/ArxContainer/README.md delete mode 100644 Artnet/util/ArxContainer/library.json delete mode 100644 Artnet/util/ArxContainer/library.properties delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/functional.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/has_include.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/has_libstdcplusplus.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/initializer_list.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/replace_minmax_macros.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/tuple.h delete mode 100644 Artnet/util/ArxTypeTraits/ArxTypeTraits/type_traits.h delete mode 100644 Artnet/util/ArxTypeTraits/LICENSE delete mode 100644 Artnet/util/ArxTypeTraits/README.md delete mode 100644 Artnet/util/ArxTypeTraits/library.json delete mode 100644 Artnet/util/ArxTypeTraits/library.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 933c4f1..ddb1da6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -63,6 +63,8 @@ jobs: - examples/WiFi libraries: | - source-path: ./ + - name: ArxContainer + - name: ArxTypeTraits - name: WiFi - name: FastLED verbose: true @@ -105,6 +107,8 @@ jobs: - examples/WiFi/sender libraries: | - source-path: ./ + - name: ArxContainer + - name: ArxTypeTraits - name: WiFiNINA - name: VidorPeripherals - name: FastLED @@ -190,6 +194,8 @@ jobs: - examples/Ethernet/sender libraries: | - source-path: ./ + - name: ArxContainer + - name: ArxTypeTraits - name: Ethernet - name: FastLED verbose: true @@ -228,5 +234,7 @@ jobs: - examples/ETH libraries: | - source-path: ./ + - name: ArxContainer + - name: ArxTypeTraits - name: FastLED verbose: true diff --git a/Artnet/util/ArxContainer/ArxContainer.h b/Artnet/util/ArxContainer/ArxContainer.h deleted file mode 100644 index 9b9494f..0000000 --- a/Artnet/util/ArxContainer/ArxContainer.h +++ /dev/null @@ -1,769 +0,0 @@ -#pragma once - -#ifndef ARX_RINGBUFFER_H -#define ARX_RINGBUFFER_H - -#include "ArxContainer/has_include.h" -#include "ArxContainer/has_libstdcplusplus.h" - -#ifdef ARDUINO -#include -#endif - -#include "ArxContainer/replace_minmax_macros.h" -#include "ArxContainer/initializer_list.h" - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201103L // Have libstdc++11 - -#include -#include -#include -#include - -#else // Do not have libstdc++11 - -#include - -#ifndef ARX_VECTOR_DEFAULT_SIZE -#define ARX_VECTOR_DEFAULT_SIZE 16 -#endif // ARX_VECTOR_DEFAULT_SIZE - -#ifndef ARX_DEQUE_DEFAULT_SIZE -#define ARX_DEQUE_DEFAULT_SIZE 16 -#endif // ARX_DEQUE_DEFAULT_SIZE - -#ifndef ARX_MAP_DEFAULT_SIZE -#define ARX_MAP_DEFAULT_SIZE 16 -#endif // ARX_MAP_DEFAULT_SIZE - -namespace arx { - -namespace container { - namespace detail { - template - T&& move(T& t) { return static_cast(t); } - } // namespace detail -} // namespace container - -template -class RingBuffer { - class Iterator { - friend RingBuffer; - - T* ptr {nullptr}; // pointer to the first element - int pos {0}; - - Iterator() {} - Iterator(T* ptr, int pos) - : ptr(ptr), pos(pos) {} - - public: - Iterator(const Iterator& it) { - this->ptr = it.ptr; - this->pos = it.pos; - } - - Iterator(Iterator&& it) { - this->ptr = container::detail::move(it.ptr); - this->pos = container::detail::move(it.pos); - } - - int index() const { - if (pos >= 0) - return pos % N; - else - return N - (abs(pos) % (N + 1)); - } - - int index_with_offset(const int i) const { - const int p = pos + i; - if (p >= 0) - return p % N; - else - return N - (abs(p) % (N + 1)); - } - - T& operator*() { - return *(ptr + index()); - } - const T& operator*() const { - return *(ptr + index()); - } - T* operator->() { - return ptr + index(); - } - const T* operator->() const { - return ptr + index(); - } - - Iterator operator+(const Iterator& rhs) { - Iterator it(this->ptr, this->pos + rhs.pos); - return it; - } - Iterator operator+(const int n) { - Iterator it(this->ptr, this->pos + n); - return it; - } - Iterator operator-(const Iterator& rhs) { - Iterator it(this->ptr, this->pos - rhs.pos); - return it; - } - Iterator operator-(const int n) { - Iterator it(this->ptr, this->pos - n); - return it; - } - Iterator& operator+=(const Iterator& rhs) { - this->pos += rhs.pos; - return *this; - } - Iterator& operator+=(const int n) { - this->pos += n; - return *this; - } - Iterator& operator-=(const Iterator& rhs) { - this->pos -= rhs.pos; - return *this; - } - Iterator& operator-=(const int n) { - this->pos -= n; - return *this; - } - - // prefix increment/decrement - Iterator& operator++() { - ++pos; - return *this; - } - Iterator& operator--() { - --pos; - return *this; - } - // postfix increment/decrement - Iterator operator++(int) { - Iterator it = *this; - ++pos; - return it; - } - Iterator operator--(int) { - Iterator it = *this; - --pos; - return it; - } - - Iterator& operator=(const Iterator& rhs) { - this->ptr = rhs.ptr; - this->pos = rhs.pos; - return *this; - } - Iterator& operator=(Iterator&& rhs) { - this->ptr = container::detail::move(rhs.ptr); - this->pos = container::detail::move(rhs.pos); - return *this; - } - - bool operator==(const Iterator& rhs) const { - return (rhs.ptr == ptr) && (rhs.pos == pos); - } - bool operator!=(const Iterator& rhs) const { - return !(*this == rhs); - } - bool operator<(const Iterator& rhs) const { - return pos < rhs.pos; - } - bool operator<=(const Iterator& rhs) const { - return pos <= rhs.pos; - } - bool operator>(const Iterator& rhs) const { - return pos > rhs.pos; - } - bool operator>=(const Iterator& rhs) const { - return pos >= rhs.pos; - } - - private: - int raw_pos() const { - return pos; - } - - void set(const int i) { - pos = i; - } - - void reset() { - pos = 0; - } - }; - -protected: - friend class Iterator; - - T queue_[N]; - Iterator head_; - Iterator tail_; - -public: - using iterator = Iterator; - using const_iterator = const Iterator; - - RingBuffer() - : queue_() - , head_(queue_, 0) - , tail_(queue_, 0) { - } - - RingBuffer(std::initializer_list lst) - : queue_() - , head_(queue_, 0) - , tail_(queue_, 0) { - for (auto it = lst.begin(); it != lst.end(); ++it) { - push_back(*it); - } - } - - // copy - explicit RingBuffer(const RingBuffer& r) - : queue_() - , head_(r.head_) - , tail_(r.tail_) { - for (size_t i = 0; i < r.size(); ++i) - queue_[i] = r.queue_[i]; - } - RingBuffer& operator=(const RingBuffer& r) { - head_ = r.head_; - tail_ = r.tail_; - for (size_t i = 0; i < r.size(); ++i) - queue_[i] = r.queue_[i]; - return *this; - } - - // move - RingBuffer(RingBuffer&& r) { - head_ = container::detail::move(r.head_); - tail_ = container::detail::move(r.tail_); - for (size_t i = 0; i < r.size(); ++i) - queue_[i] = container::detail::move(r.queue_[i]); - } - - RingBuffer& operator=(RingBuffer&& r) { - head_ = container::detail::move(r.head_); - tail_ = container::detail::move(r.tail_); - for (size_t i = 0; i < r.size(); ++i) - queue_[i] = container::detail::move(r.queue_[i]); - return *this; - } - - virtual ~RingBuffer() {} - - size_t capacity() const { return N; }; - size_t size() const { return abs(tail_.raw_pos() - head_.raw_pos()); } - inline const T* data() const { return &(get(head_)); } - T* data() { return &(get(head_)); } - bool empty() const { return tail_ == head_; } - void clear() { - head_.reset(); - tail_.reset(); - } - - void pop() { - pop_front(); - } - void pop_front() { - if (size() == 0) return; - if (size() == 1) - clear(); - else - increment_head(); - } - void pop_back() { - if (size() == 0) return; - if (size() == 1) - clear(); - else - decrement_tail(); - } - - void push(const T& data) { - push_back(data); - } - void push(T&& data) { - push_back(data); - } - void push_back(const T& data) { - get(tail_) = data; - increment_tail(); - }; - void push_back(T&& data) { - get(tail_) = data; - increment_tail(); - }; - void push_front(const T& data) { - get(head_) = data; - decrement_head(); - }; - void push_front(T&& data) { - get(head_) = data; - decrement_head(); - }; - void emplace(const T& data) { push(data); } - void emplace(T&& data) { push(data); } - void emplace_back(const T& data) { push_back(data); } - void emplace_back(T&& data) { push_back(data); } - - const T& front() const { return get(head_); }; - T& front() { return get(head_); }; - - const T& back() const { return get(size() - 1); } - T& back() { return get(size() - 1); } - - const T& operator[](size_t index) const { return get((int)index); } - T& operator[](size_t index) { return get((int)index); } - - iterator begin() { return empty() ? Iterator() : head_; } - iterator end() { return empty() ? Iterator() : tail_; } - const_iterator begin() const { return empty() ? Iterator() : head_; } - const_iterator end() const { return empty() ? Iterator() : tail_; } - - iterator erase(const iterator& p) { - if (!is_valid(p)) return end(); - - iterator it_last = begin() + size() - 1; - for (iterator it = p; it != it_last; ++it) - *it = *(it + 1); - *it_last = T(); - decrement_tail(); - return empty() ? end() : p; - } - - void resize(size_t sz) { - size_t s = size(); - if (sz > size()) { - for (size_t i = 0; i < sz - s; ++i) push(T()); - } else if (sz < size()) { - for (size_t i = 0; i < s - sz; ++i) pop(); - } - } - - void assign(const_iterator first, const_iterator end) { - clear(); - while (first != end) push(*(first++)); - } - - void assign(const T* first, const T* end) { - clear(); - // T* it = first; - while (first != end) push(*(first++)); - } - - void shrink_to_fit() { - // dummy - } - - void reserve(size_t n) { - (void)n; - // dummy - } - - void fill(const T& v) { - iterator it = begin(); - while (it != end()) { - *it = v; - ++it; - } - } - - void insert(const_iterator pos, const_iterator first, const_iterator last) { - if (pos != end()) { - size_t sz = 0; - { - for (iterator it = first; it != last; ++it) ++sz; - } - iterator it = end() + sz - 1; - for (int i = sz; i > 0; --i, --it) - *it = *(it - sz); - it = pos; - for (size_t i = 0; i < sz; ++i) - *it = *(first + i); - } else { - for (iterator it = first; it != last; ++it) - push_back(*it); - } - } - - void insert(const_iterator pos, const T* first, const T* last) { - if (pos != end()) { - size_t sz = 0; - { - for (const T* it = first; it != last; ++it) ++sz; - } - iterator it = end() + sz - 1; - for (int i = sz; i > 0; --i, --it) - *it = *(it - sz); - it = pos; - for (size_t i = 0; i < sz; ++i) - *it = *(first + i); - } else { - for (const T* it = first; it != last; ++it) - push_back(*it); - } - } - -private: - T& get(const Iterator& it) { - return queue_[it.index()]; - } - const T& get(const Iterator& it) const { - return queue_[it.index()]; - } - T& get(const int index) { - return queue_[head_.index_with_offset(index)]; - } - const T& get(const int index) const { - return queue_[head_.index_with_offset(index)]; - } - - T* ptr(const Iterator& it) { - return (T*)(queue_ + it.index()); - } - const T* ptr(const Iterator& it) const { - return (T*)(queue_ + it.index()); - } - T* ptr(const int index) { - return (T*)(queue_ + head_.index_with_offset(index)); - } - const T* ptr(const int index) const { - return (T*)(queue_ + head_.index_with_offset(index)); - } - - void increment_head() { - ++head_; - resolve_overflow(); - } - void increment_tail() { - ++tail_; - resolve_overflow(); - if (size() > N) - increment_head(); - } - void decrement_head() { - --head_; - resolve_overflow(); - if (size() > N) - decrement_tail(); - } - void decrement_tail() { - --tail_; - resolve_overflow(); - } - - void resolve_overflow() { - if (empty()) - clear(); - else if (head_.raw_pos() > tail_.raw_pos()) { - // the same value will be obtained regardless of which of the head tail overflows - int len = (INT_MAX - head_.raw_pos()) + (tail_.raw_pos() - INT_MIN); - clear(); - tail_.set(len); - } - } - - bool is_valid(const iterator& it) { - return (it.raw_pos() >= head_.raw_pos()) && (it.raw_pos() < tail_.raw_pos()); - } -}; - -template -bool operator==(const RingBuffer& x, const RingBuffer& y) { - if (x.size() != y.size()) return false; - for (size_t i = 0; i < x.size(); ++i) - if (x[i] != y[i]) return false; - return true; -} - -template -bool operator!=(const RingBuffer& x, const RingBuffer& y) { - return !(x == y); -} - -template -struct vector : public RingBuffer { - using iterator = typename RingBuffer::iterator; - using const_iterator = typename RingBuffer::const_iterator; - - vector() - : RingBuffer() {} - vector(std::initializer_list lst) - : RingBuffer(lst) {} - - // copy - vector(const vector& r) - : RingBuffer(r) {} - - vector& operator=(const vector& r) { - RingBuffer::operator=(r); - return *this; - } - - // move - vector(vector&& r) - : RingBuffer(r) {} - - vector& operator=(vector&& r) { - RingBuffer::operator=(r); - return *this; - } - - virtual ~vector() {} - -private: - using RingBuffer::pop; - using RingBuffer::pop_front; - using RingBuffer::push; - using RingBuffer::push_front; - using RingBuffer::emplace; - using RingBuffer::fill; -}; - -template -struct array : public RingBuffer { - using iterator = typename RingBuffer::iterator; - using const_iterator = typename RingBuffer::const_iterator; - - array() - : RingBuffer() {} - array(std::initializer_list lst) - : RingBuffer(lst) {} - - // copy - array(const array& r) - : RingBuffer(r) {} - - array& operator=(const array& r) { - RingBuffer::operator=(r); - return *this; - } - - // move - array(array&& r) - : RingBuffer(r) {} - - array& operator=(array&& r) { - RingBuffer::operator=(r); - return *this; - } - - virtual ~array() {} - -private: - using RingBuffer::pop; - using RingBuffer::pop_front; - using RingBuffer::push; - using RingBuffer::push_front; - using RingBuffer::emplace; -}; - -template -struct deque : public RingBuffer { - using iterator = typename RingBuffer::iterator; - using const_iterator = typename RingBuffer::const_iterator; - - deque() - : RingBuffer() {} - deque(std::initializer_list lst) - : RingBuffer(lst) {} - - // copy - deque(const deque& r) - : RingBuffer(r) {} - - deque& operator=(const deque& r) { - RingBuffer::operator=(r); - return *this; - } - - // move - deque(deque&& r) - : RingBuffer(r) {} - - deque& operator=(deque&& r) { - RingBuffer::operator=(r); - return *this; - } - - virtual ~deque() {} - -private: - using RingBuffer::capacity; - using RingBuffer::pop; - using RingBuffer::push; - using RingBuffer::emplace; - using RingBuffer::assign; - using RingBuffer::begin; - using RingBuffer::end; - using RingBuffer::fill; -}; - -template -struct pair { - T1 first; - T2 second; -}; - -template -pair make_pair(const T1& t1, const T2& t2) { - return {t1, t2}; -}; - -template -bool operator==(const pair& x, const pair& y) { - return (x.first == y.first) && (x.second == y.second); -} - -template -bool operator!=(const pair& x, const pair& y) { - return !(x == y); -} - -template -struct map : public RingBuffer, N> { - using iterator = typename RingBuffer, N>::iterator; - using const_iterator = typename RingBuffer, N>::const_iterator; - using base = RingBuffer, N>; - - map() - : base() {} - map(std::initializer_list > lst) - : base(lst) {} - - // copy - map(const map& r) - : base(r) {} - - map& operator=(const map& r) { - base::operator=(r); - return *this; - } - - // move - map(map&& r) - : RingBuffer(r) {} - - map& operator=(map&& r) { - base::operator=(r); - return *this; - } - - virtual ~map() {} - - const_iterator find(const Key& key) const { - for (size_t i = 0; i < this->size(); ++i) { - const_iterator it = this->begin() + i; - if (key == it->first) - return it; - } - return this->end(); - } - - iterator find(const Key& key) { - for (size_t i = 0; i < this->size(); ++i) { - iterator it = this->begin() + i; - if (key == it->first) - return it; - } - return this->end(); - } - - pair insert(const Key& key, const T& t) { - bool b {false}; - iterator it = find(key); - if (it == this->end()) { - this->push(make_pair(key, t)); - b = true; - it = this->begin() + this->size() - 1; - } - return {it, b}; - } - - pair insert(const pair& p) { - bool b {false}; - iterator it = find(p.first); - if (it == this->end()) { - this->push(p); - b = true; - it = this->begin() + this->size() - 1; - } - return {it, b}; - } - - pair emplace(const Key& key, const T& t) { - return insert(key, t); - } - - pair emplace(const pair& p) { - return insert(p); - } - - const T& at(const Key& key) const { - // iterator it = find(key); - // if (it != this->end()) return it->second; - // return T(); - return find(key)->second; - } - - T& at(const Key& key) { - // iterator it = find(key); - // if (it != this->end()) return it->second; - // return T(); - return find(key)->second; - } - - iterator erase(const iterator& it) { - iterator i = (iterator)find(it->first); - return base::erase(i); - } - - iterator erase(const Key& key) { - iterator i = find(key); - return base::erase(i); - } - - iterator erase(const size_t index) { - if (index < this->size()) { - iterator it = this->begin() + index; - erase(it); - } - return this->end(); - } - - T& operator[](const Key& key) { - iterator it = find(key); - if (it != this->end()) return it->second; - - insert(::arx::make_pair(key, T())); - return this->back().second; - } - -private: - using base::assign; - using base::back; - using base::capacity; - using base::data; - using base::emplace_back; - using base::front; - using base::pop; - using base::pop_back; - using base::pop_front; - using base::push; - using base::push_back; - using base::push_front; - using base::resize; - using base::shrink_to_fit; - using base::fill; -}; - -} // namespace arx - -template -using ArxRingBuffer = arx::RingBuffer; - -#endif // Do not have libstdc++11 -#endif // ARX_RINGBUFFER_H diff --git a/Artnet/util/ArxContainer/ArxContainer/has_include.h b/Artnet/util/ArxContainer/ArxContainer/has_include.h deleted file mode 100644 index d605d71..0000000 --- a/Artnet/util/ArxContainer/ArxContainer/has_include.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_HAS_INCLUDE_H -#define ARX_TYPE_TRAITS_HAS_INCLUDE_H - - // Check whether __has_include is available, but also check the GCC - // version (__has_include was introduced in gcc 5) to catch - // environments (such as ESP8266) where gcc is old, but some system - // header provides a fake __has_include. We also need to check - // against __clang__ here, since clang pretends to be GCC - // 4.something and would otherwise be detected incorrectly here... - #if !defined(__has_include) || defined(__GNUC__) && __GNUC__ < 5 && !defined(__clang__) - #if defined(ARDUINO_ARCH_ESP8266) - // ESP8266 does not have a working __has_include, but we - // know it does have a working libstdc++ with all the - // headers we care about, so provide a fake has_include - #define ARX_SYSTEM_HAS_INCLUDE(x) 1 - #elif defined(ARDUINO_SAM_DUE) - // Arduino DUE's GCC version is 4.8.3 (GCC < 5.0). - // If libstdc++ is used, std::function causes error - // so currently we disable libstdc++ and use ArxTypeTraits - #define ARX_SYSTEM_HAS_INCLUDE(x) 0 - #else - #error "Compiler does not support __has_include, please report a bug against the ArxTypeTraits library about this." - #endif - #else - #define ARX_SYSTEM_HAS_INCLUDE(x) __has_include(x) - #endif - -#endif // ARX_TYPE_TRAITS_HAS_INCLUDE_H diff --git a/Artnet/util/ArxContainer/ArxContainer/has_libstdcplusplus.h b/Artnet/util/ArxContainer/ArxContainer/has_libstdcplusplus.h deleted file mode 100644 index 23f2b26..0000000 --- a/Artnet/util/ArxContainer/ArxContainer/has_libstdcplusplus.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H -#define ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H - -#if !defined(ARX_HAVE_LIBSTDCPLUSPLUS) - #if ARX_SYSTEM_HAS_INCLUDE() && !defined(ARDUINO_spresense_ast) - #include - #if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) - // For gcc's libstdc++ and clang's libc++, assume that - // __cplusplus tells us what the standard includes support - #define ARX_HAVE_LIBSTDCPLUSPLUS __cplusplus - #elif defined(_CPPLIB_VER) - #if _CPPLIB_VER > 650 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201703L // C++17 - #elif _CPPLIB_VER == 650 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201402L // C++14 - #elif _CPPLIB_VER >= 610 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201103L // C++11 - #else - #define ARX_HAVE_LIBSTDCPLUSPLUS 199711L // C++98 - #endif - #elif defined(__UCLIBCXX_MAJOR__) - // For uclibc++, assume C++98 support only. - #define ARX_HAVE_LIBSTDCPLUSPLUS 199711L - #else - #error "Unknown C++ library found, please report a bug against the ArxTypeTraits library about this." - #endif - #else - // Assume no standard library is available at all (e.g. on AVR) - #define ARX_HAVE_LIBSTDCPLUSPLUS 0 - #endif -#endif - -#endif // ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H diff --git a/Artnet/util/ArxContainer/ArxContainer/initializer_list.h b/Artnet/util/ArxContainer/ArxContainer/initializer_list.h deleted file mode 100644 index 374aa27..0000000 --- a/Artnet/util/ArxContainer/ArxContainer/initializer_list.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_INITIALIZER_H -#define ARX_TYPE_TRAITS_INITIALIZER_H - -// Initializer_list *must* be defined in std, so take extra care to only -// define it when is really not available (e.g. -// ArduinoSTL is C++98 but *does* define ) and not -// already defined (e.g. by ArxContainer). -#if ARX_SYSTEM_HAS_INCLUDE() -#include -#else -namespace std { -template -class initializer_list { -private: - const T* array; - size_t len; - initializer_list(const T* a, size_t l) - : array(a), len(l) {} - -public: - initializer_list() - : array(nullptr), len(0) {} - size_t size() const { return len; } - const T* begin() const { return array; } - const T* end() const { return array + len; } -}; -} // namespace std -#endif - -#endif // ARX_TYPE_TRAITS_INITIALIZER_LIST_H diff --git a/Artnet/util/ArxContainer/ArxContainer/replace_minmax_macros.h b/Artnet/util/ArxContainer/ArxContainer/replace_minmax_macros.h deleted file mode 100644 index f8ff86e..0000000 --- a/Artnet/util/ArxContainer/ArxContainer/replace_minmax_macros.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H -#define ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H - -// Make sure Arduino.h is actually included, since otherwise it might be -// included later and break *uses* of the min/max methods, rather than -// the declarations of it. -#ifdef ARDUINO - #include -#endif - -// These macros are defined by Arduino.h on some platforms, and conflict -// with min/max methods defined or included by ArxTypeTraits, so replace -// them with macros here. -#ifdef max - #undef max - template - constexpr auto max(T1 x, T2 y) - -> decltype(x + y) - { - return (x > y) ? x : y; - } -#endif -#ifdef min - #undef min - template - constexpr auto min(T1 x, T2 y) - -> decltype(x + y) - { - return (x < y) ? x : y; - } -#endif - -#endif // ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H diff --git a/Artnet/util/ArxContainer/LICENSE b/Artnet/util/ArxContainer/LICENSE deleted file mode 100644 index 8c86460..0000000 --- a/Artnet/util/ArxContainer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Hideaki Tai - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Artnet/util/ArxContainer/README.md b/Artnet/util/ArxContainer/README.md deleted file mode 100644 index c06c0b8..0000000 --- a/Artnet/util/ArxContainer/README.md +++ /dev/null @@ -1,194 +0,0 @@ -# ArxContainer - -C++ container-like classes (`vector`, `array`, `deque`, `map` etc.) for Arduino which cannot use STL - -## Note - -- `ArxContainer` is C++ container-__like__ classes for Arduino - - Containers in this library is defined inside namespace `arx` instad of `std` (e.g. `arx::vector`) - - All of the functions is not supported currently -- If standard libraries are available, automatically use `std` version instead of `arx` version - - -## Supported Container Types - -- `vector` -- `array` -- `map` (`pair`) -- `deque` - - -## Supported Boards - -`arx` version of containers are enabled only if you use following architecture. -In other borads, `arx` 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) - - -## Usage - -### vector - -```C++ -// initialize with initializer_list -arx::vector 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); -``` - -### array - -```C++ -// initialize with initializer_list -arx::array 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); -``` - -### map - -``` C++ -// initialize with initializer_list -arx::map 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"]); -``` - -### deque - -```C++ -// initialize with initializer_list -arx::deque 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]); -``` - - -## Detail - -`ArxContainer` is C++ container-__like__ classes for Arduino. -This library is based on `arx::RingBuffer` and `arx::xxxx` is limited-size container. -`arx::RingBuffer` can be used as: - -```C++ -ArxRingBuffer 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::xxxx` are derived from `RingBuffer` and defined as: - -``` C++ -namespace arx { - template - struct vector : public RingBuffer - - template - struct array : public RingBuffer - - template - struct map : public RingBuffer, N> - - template - struct deque : public RingBuffer -} -``` - -So range-based loop cannot be applyed to `arx::deque` (iterator is not continuous because it is based on `RingBuffer`). - - -### Manage Size Limit of Container - -Global default size of container can be changed by defining these macros before `#include `. - -``` C++ -#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. - -``` C++ -arx::vector vs; -arx::map ms; -arx::deque ds; -``` - -## Roadmap - -This library will be updated if I want to use more container interfaces on supported boards shown above. -PRs are welcome! - - -## Used Inside of - -- [Packetizer](https://github.com/hideakitai/Packetizer) -- [MsgPack](https://github.com/hideakitai/MsgPack) -- [ArduinoOSC](https://github.com/hideakitai/ArduinoOSC) -- [ArtNet](https://github.com/hideakitai/ArtNet) -- [Tween](https://github.com/hideakitai/Tween) -- [TimeProfiler](https://github.com/hideakitai/TimeProfiler) -- [TaskManager](https://github.com/hideakitai/TaskManager) -- [ArxStringUtils](https://github.com/hideakitai/ArxStringUtils) -- [Debouncer](https://github.com/hideakitai/Debouncer) - - -## License - -MIT diff --git a/Artnet/util/ArxContainer/library.json b/Artnet/util/ArxContainer/library.json deleted file mode 100644 index baf2512..0000000 --- a/Artnet/util/ArxContainer/library.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "ArxContainer", - "keywords": "ringbuffer, vector, deque, map", - "description": "C++ container-like classes (vector, map, etc.) for Arduino which cannot use STL", - "repository": { - "type": "git", - "url": "https://github.com/hideakitai/ArxContainer.git" - }, - "authors": { - "name": "Hideaki Tai", - "url": "https://github.com/hideakitai", - "maintainer": true - }, - "version": "0.4.0", - "license": "MIT", - "frameworks": "arduino", - "platforms": "*" -} diff --git a/Artnet/util/ArxContainer/library.properties b/Artnet/util/ArxContainer/library.properties deleted file mode 100644 index c04d569..0000000 --- a/Artnet/util/ArxContainer/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=ArxContainer -version=0.4.0 -author=hideakitai -maintainer=hideakitai -sentence=C++ container-like classes (vector, map, etc.) for Arduino which cannot use STL -paragraph=C++ container-like classes (vector, map, etc.) for Arduino which cannot use STL -category=Data Storage -url=https://github.com/hideakitai/ArxContainer -architectures=* diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits.h deleted file mode 100644 index f963316..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_H -#define ARX_TYPE_TRAITS_H - -#include "ArxTypeTraits/has_include.h" -#include "ArxTypeTraits/has_libstdcplusplus.h" - -// Make sure std namespace exists -namespace std { } - -// Import everything from the std namespace into arx::std, so that -// anything we import rather than define is also available through -// arx::stdx. -// This includes everything yet to be defined, so we can do this early -// (and must do so, to allow e.g. the C++14 additions in the arx::std -// namespace to reference the C++11 stuff from the system headers. -namespace arx { - namespace stdx { - using namespace ::std; - } -} - -// Import everything from arx::std back into the normal std namespace. -// This ensures that you can just use `std::foo` everywhere and you get -// the standard library version if it is available, falling back to arx -// versions for things not supplied by the standard library. Only when -// you really need the arx version (e.g. for constexpr numeric_limits -// when also using ArduinoSTL), you need to qualify with arx::stdx:: -namespace std { - using namespace ::arx::stdx; -} - -#include "ArxTypeTraits/replace_minmax_macros.h" - -#include "ArxTypeTraits/type_traits.h" - -#endif // ARX_TYPE_TRAITS_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/functional.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/functional.h deleted file mode 100644 index ed25943..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/functional.h +++ /dev/null @@ -1,165 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_FUNCTIONAL_H -#define ARX_TYPE_TRAITS_FUNCTIONAL_H - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201103L // Have libstdc++11 - -#include - -#else // Do not have libstdc++11 - -// If we have a header, include it and assume it has placement new -// (for AVR this has always been true, MEGAAVR does not have placement -// new now, but will probably get it before is added). -// This also handles the case where ArduinoSTL is used, which defines an -// inline placement new which would conflict with the below definition. -#if ARX_SYSTEM_HAS_INCLUDE() -#include -#else -// When there is no header, there might be a header, but -// not all Arduino platform (versions) define a placement new operator -// in there. -// However, it is hard to detect whether it is or is not defined, but -// the versions that do define it, do not define it inline in the -// header, so we can just define it inline here without conflicts. -// Note that there is no need to include anything to declare the -// non-placement new operators, since those are implicit. -inline void* operator new (const size_t size, void* ptr) noexcept { (void)size; return ptr; } -#endif - -namespace arx { namespace stdx { - - // reference: - // stack overflow https://stackoverflow.com/questions/32074410/stdfunction-bind-like-type-erasure-without-standard-c-library - - template - class function; - - template - class function - { - struct vtable_t - { - void (*mover)(void* src, void* dest); - void (*destroyer)(void*); - R (*invoke)(void const* t, Args&&... args); - - template - static vtable_t const* get() - { - static const vtable_t table = - { - // mover - [] (void* src, void* dest) - { - new(dest) T(move(*static_cast(src))); - }, - // destroyer - [] (void* t) - { - static_cast(t)->~T(); - }, - // invoke - [] (void const* t, Args&&... args) -> R - { - return (*static_cast(t))(std::forward(args)...); - } - }; - return &table; - } - }; - - vtable_t const* table {nullptr}; - void* data {nullptr}; - - public: - - template < - class Func, - class dF = typename std::decay::type, - typename enable_if {}>::type* = nullptr, - typename enable_if ::type, R>{}>::type* = nullptr - > - function(const Func& f) - : table(vtable_t::template get()) - { - data = reinterpret_cast(new Func(f)); - } - function(const function& o) - : table(o.table) - { - data = o.data; - } - function(function&& o) - : table(o.table) - { - if (table) table->mover(o.data, data); - } - function() - { - } - ~function() - { - if (table) table->destroyer(data); - } - - function& operator= (const function& o) - { - this->~function(); - new(this) function(move(o)); - return *this; - } - function& operator= (function&& o) - { - this->~function(); - new(this) function(move(o)); - return *this; - } - function& operator= (std::nullptr_t p) - { - (void)p; - this->~function(); - return *this; - } - - explicit operator bool() const - { - return table; - } - - R operator()(Args...args) const - { - return table->invoke(data, forward(args)...); - } - }; - - template - inline bool operator== (const function& f, std::nullptr_t) - { - return !static_cast(f); - } - - template - inline bool operator== (std::nullptr_t, const function& f) - { - return !static_cast(f); - } - - template - inline bool operator!= (const function& f, std::nullptr_t) - { - return static_cast(f); - } - - template - inline bool operator!= (std::nullptr_t, const function& f) - { - return static_cast(f); - } - -} } // namespace arx::std - -#endif // Do not have libstdc++11 - -#endif // ARX_TYPE_TRAITS_FUNCTIONAL_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_include.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_include.h deleted file mode 100644 index d605d71..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_include.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_HAS_INCLUDE_H -#define ARX_TYPE_TRAITS_HAS_INCLUDE_H - - // Check whether __has_include is available, but also check the GCC - // version (__has_include was introduced in gcc 5) to catch - // environments (such as ESP8266) where gcc is old, but some system - // header provides a fake __has_include. We also need to check - // against __clang__ here, since clang pretends to be GCC - // 4.something and would otherwise be detected incorrectly here... - #if !defined(__has_include) || defined(__GNUC__) && __GNUC__ < 5 && !defined(__clang__) - #if defined(ARDUINO_ARCH_ESP8266) - // ESP8266 does not have a working __has_include, but we - // know it does have a working libstdc++ with all the - // headers we care about, so provide a fake has_include - #define ARX_SYSTEM_HAS_INCLUDE(x) 1 - #elif defined(ARDUINO_SAM_DUE) - // Arduino DUE's GCC version is 4.8.3 (GCC < 5.0). - // If libstdc++ is used, std::function causes error - // so currently we disable libstdc++ and use ArxTypeTraits - #define ARX_SYSTEM_HAS_INCLUDE(x) 0 - #else - #error "Compiler does not support __has_include, please report a bug against the ArxTypeTraits library about this." - #endif - #else - #define ARX_SYSTEM_HAS_INCLUDE(x) __has_include(x) - #endif - -#endif // ARX_TYPE_TRAITS_HAS_INCLUDE_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_libstdcplusplus.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_libstdcplusplus.h deleted file mode 100644 index 23f2b26..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/has_libstdcplusplus.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H -#define ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H - -#if !defined(ARX_HAVE_LIBSTDCPLUSPLUS) - #if ARX_SYSTEM_HAS_INCLUDE() && !defined(ARDUINO_spresense_ast) - #include - #if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION) - // For gcc's libstdc++ and clang's libc++, assume that - // __cplusplus tells us what the standard includes support - #define ARX_HAVE_LIBSTDCPLUSPLUS __cplusplus - #elif defined(_CPPLIB_VER) - #if _CPPLIB_VER > 650 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201703L // C++17 - #elif _CPPLIB_VER == 650 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201402L // C++14 - #elif _CPPLIB_VER >= 610 - #define ARX_HAVE_LIBSTDCPLUSPLUS 201103L // C++11 - #else - #define ARX_HAVE_LIBSTDCPLUSPLUS 199711L // C++98 - #endif - #elif defined(__UCLIBCXX_MAJOR__) - // For uclibc++, assume C++98 support only. - #define ARX_HAVE_LIBSTDCPLUSPLUS 199711L - #else - #error "Unknown C++ library found, please report a bug against the ArxTypeTraits library about this." - #endif - #else - // Assume no standard library is available at all (e.g. on AVR) - #define ARX_HAVE_LIBSTDCPLUSPLUS 0 - #endif -#endif - -#endif // ARX_TYPE_TRAITS_HAS_LIBSTDCPLUSPLUS_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/initializer_list.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/initializer_list.h deleted file mode 100644 index b1cd74f..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/initializer_list.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_INITIALIZER_H -#define ARX_TYPE_TRAITS_INITIALIZER_H - -// Initializer_list *must* be defined in std, so take extra care to only -// define it when is really not available (e.g. -// ArduinoSTL is C++98 but *does* define ) and not -// already defined (e.g. by ArxContainer). -#if ARX_SYSTEM_HAS_INCLUDE() -#include -#else -namespace std { - template - class initializer_list - { - private: - const T* array; - size_t len; - initializer_list(const T* a, size_t l) : array(a), len(l) {} - public: - initializer_list() : array(nullptr), len(0) {} - size_t size() const { return len; } - const T *begin() const { return array; } - const T *end() const { return array + len; } - }; -} // namespace std -#endif - -#endif // ARX_TYPE_TRAITS_INITIALIZER_LIST_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/replace_minmax_macros.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/replace_minmax_macros.h deleted file mode 100644 index f8ff86e..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/replace_minmax_macros.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H -#define ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H - -// Make sure Arduino.h is actually included, since otherwise it might be -// included later and break *uses* of the min/max methods, rather than -// the declarations of it. -#ifdef ARDUINO - #include -#endif - -// These macros are defined by Arduino.h on some platforms, and conflict -// with min/max methods defined or included by ArxTypeTraits, so replace -// them with macros here. -#ifdef max - #undef max - template - constexpr auto max(T1 x, T2 y) - -> decltype(x + y) - { - return (x > y) ? x : y; - } -#endif -#ifdef min - #undef min - template - constexpr auto min(T1 x, T2 y) - -> decltype(x + y) - { - return (x < y) ? x : y; - } -#endif - -#endif // ARX_TYPE_TRAITS_REPLACE_MINMAX_MACROS_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/tuple.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/tuple.h deleted file mode 100644 index 2c13d95..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/tuple.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_TUPLE_H -#define ARX_TYPE_TRAITS_TUPLE_H - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201103L // Have libstdc++11 - -#include - -#else // Do not have libstdc++11 - -namespace arx { namespace stdx { - - // https://theolizer.com/cpp-school2/cpp-school2-15/ - // https://wandbox.org/permlink/C0BWIzjqg4iO3kKZ - - template - struct tuple - { - tuple() {} - }; - - template - class tuple : public tuple - { - template friend struct get_helper; - tFirst mMember; - public: - tuple(tFirst const& iFirst, tRest const&... iRest) - : tuple(iRest...) - , mMember(iFirst) - { } - constexpr tuple() {} - }; - - template - struct get_helper { }; - template - struct get_helper<0, tFirst, tRest...> - { - typedef tFirst type; - static type& get(tuple& iTuple) - { - return iTuple.mMember; - } - }; - template - struct get_helper - { - typedef typename get_helper::type type; - static type& get(tuple& iTuple) - { - return get_helper::get(iTuple); - } - }; - - template - typename get_helper::type& get(tuple& iTuple) - { - return get_helper::get(iTuple); - } - - template class tuple_size; - template class tuple_size; - template class tuple_size; - template class tuple_size; - template - class tuple_size > - : public integral_constant {}; - - template - auto make_tuple(Types&&... args) - -> std::tuple::type...> - { - return std::tuple::type...>(std::forward::type>(args)...); - } - -} } // namespace arx::std - -#endif // Do not have libstdc++11 - -#endif // ARX_TYPE_TRAITS_TUPLE_H diff --git a/Artnet/util/ArxTypeTraits/ArxTypeTraits/type_traits.h b/Artnet/util/ArxTypeTraits/ArxTypeTraits/type_traits.h deleted file mode 100644 index ff41693..0000000 --- a/Artnet/util/ArxTypeTraits/ArxTypeTraits/type_traits.h +++ /dev/null @@ -1,638 +0,0 @@ -#pragma once - -#ifndef ARX_TYPE_TRAITS_TYPE_TRAITS_H -#define ARX_TYPE_TRAITS_TYPE_TRAITS_H - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 199711L // Have libstdc++98 - -#include - -#else // Do not have libstdc++98 - -namespace arx { namespace stdx { - - template - void swap(T& a, T& b) - { - T t = move(a); - a = move(b); - b = move(t); - } -} } // namespace arx::stdx - -#endif // Do not have libstdc++98 - - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201103L // Have libstdc++11 - -#include -#include - -#else // Do not have libstdc++11 - -#include -#include -#include - -namespace arx { namespace stdx { - - using nullptr_t = decltype(nullptr); - - // numeric_limits - - template - struct numeric_limits - { - static constexpr T max() { return T(); } - static constexpr T min() { return T(); } - }; - template <> constexpr bool numeric_limits::max() { return true; } - template <> constexpr char numeric_limits::max() { return CHAR_MAX; } - template <> constexpr signed char numeric_limits::max() { return SCHAR_MAX; } - template <> constexpr unsigned char numeric_limits::max() { return UCHAR_MAX; } -#ifndef ARDUINO_spresense_ast - template <> constexpr wchar_t numeric_limits::max() { return WCHAR_MAX; } - // template <> constexpr char8_t numeric_limits::max() { return UCHAR_MAX; } -#endif - template <> constexpr char16_t numeric_limits::max() { return UINT_LEAST16_MAX; } - template <> constexpr char32_t numeric_limits::max() { return UINT_LEAST32_MAX; } - template <> constexpr short numeric_limits::max() { return SHRT_MAX; } - template <> constexpr unsigned short numeric_limits::max() { return USHRT_MAX; } - template <> constexpr int numeric_limits::max() { return INT_MAX; } - template <> constexpr unsigned int numeric_limits::max() { return UINT_MAX; } - template <> constexpr long numeric_limits::max() { return LONG_MAX; } - template <> constexpr unsigned long numeric_limits::max() { return ULONG_MAX; } - // template <> constexpr long long numeric_limits::max() { return LLONG_MAX; } - // template <> constexpr unsigned long long numeric_limits::max() { return ULLONG_MAX; } - template <> constexpr float numeric_limits::max() { return FLT_MAX; } - template <> constexpr double numeric_limits::max() { return DBL_MAX; } - template <> constexpr long double numeric_limits::max() { return LDBL_MAX; } - - template <> constexpr bool numeric_limits::min() { return false; } - template <> constexpr char numeric_limits::min() { return CHAR_MIN; } - template <> constexpr signed char numeric_limits::min() { return SCHAR_MIN; } - template <> constexpr unsigned char numeric_limits::min() { return 0; } -#ifndef ARDUINO_spresense_ast - template <> constexpr wchar_t numeric_limits::min() { return WCHAR_MIN; } - // template <> constexpr char8_t numeric_limits::min() { return 0; } -#endif - template <> constexpr char16_t numeric_limits::min() { return 0; } - template <> constexpr char32_t numeric_limits::min() { return 0; } - template <> constexpr short numeric_limits::min() { return SHRT_MIN; } - template <> constexpr unsigned short numeric_limits::min() { return 0; } - template <> constexpr int numeric_limits::min() { return INT_MIN; } - template <> constexpr unsigned int numeric_limits::min() { return 0; } - template <> constexpr long numeric_limits::min() { return LONG_MIN; } - template <> constexpr unsigned long numeric_limits::min() { return 0; } - // template <> constexpr long long numeric_limits::min() { return LLONG_MIN; } - // template <> constexpr unsigned long long numeric_limits::min() { return 0; } - template <> constexpr float numeric_limits::min() { return FLT_MIN; } - template <> constexpr double numeric_limits::min() { return DBL_MIN; } - template <> constexpr long double numeric_limits::min() { return LDBL_MIN; } - - - // integral_constant - - template - struct integral_constant - { - static constexpr T value = v; - using value_type = T; - using type = integral_constant; - constexpr operator value_type() const noexcept { return value; } - constexpr value_type operator()() const noexcept { return value; } - }; - - using true_type = integral_constant; - using false_type = integral_constant; - - - template - T declval(); // no implementation - - - template - struct enable_if; - template - struct enable_if { using type = T; }; - - - template - struct conditional { using type = T; }; - template - struct conditional { using type = F; }; - - - template struct remove_cv { using type = T; }; - template struct remove_cv { using type = T; }; - template struct remove_cv { using type = T; }; - template struct remove_cv { using type = T; }; - - template struct remove_const { using type = T; }; - template struct remove_const { using type = T; }; - - template struct remove_volatile { using type = T; }; - template struct remove_volatile { using type = T; }; - - template struct remove_pointer { using type = T; }; - template struct remove_pointer { using type = T; }; - template struct remove_pointer { using type = T; }; - template struct remove_pointer { using type = T; }; - template struct remove_pointer { using type = T; }; - - template struct remove_reference { using type = T; }; - template struct remove_reference { using type = T; }; - template struct remove_reference { using type = T; }; - - template struct remove_extent { typedef T type; }; - template struct remove_extent { typedef T type; }; - template struct remove_extent { typedef T type; }; - - - template - constexpr T&& forward(typename remove_reference::type& t) noexcept - { - return static_cast(t); - } - template - constexpr T&& forward(typename remove_reference::type&& t) noexcept - { - return static_cast(t); - } - - - namespace detail - { - template - struct type_identity { using type = T; }; - template - auto try_add_pointer(int) -> type_identity::type*>; - template - auto try_add_pointer(...) -> type_identity; - } - template - struct add_pointer : decltype(detail::try_add_pointer(0)) {}; - - - template - struct is_same : false_type {}; - template - struct is_same : true_type {}; - - - template - struct is_integral : false_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - template <> struct is_integral : true_type {}; - - - template - struct is_floating_point : false_type {}; - template <> struct is_floating_point : true_type {}; - template <> struct is_floating_point : true_type {}; - template <> struct is_floating_point : true_type {}; - - - template - struct is_arithmetic - : conditional< - is_integral::value || is_floating_point::value, - true_type, - false_type - >::type - {}; - - - namespace detail - { - template ::value> - struct is_signed : integral_constant {}; - template - struct is_signed : false_type {}; - } - template - struct is_signed : detail::is_signed::type {}; - - - namespace detail - { - template::value> - struct is_unsigned : integral_constant {}; - template - struct is_unsigned : false_type {}; - } - template - struct is_unsigned : detail::is_unsigned::type {}; - - - template struct is_pointer_helper : false_type {}; - template struct is_pointer_helper : true_type {}; - template struct is_pointer : is_pointer_helper::type> {}; - - - template - struct is_array : false_type {}; - template - struct is_array : true_type {}; - template - struct is_array : true_type {}; - - - namespace details - { - template - struct Tester { using type = void; }; - template - using void_t = typename Tester::type; - templateclass Z, class, class...Ts> - struct can_apply : false_type{}; - templateclass Z, class...Ts> - struct can_apply>, Ts...> : true_type{}; - - template - using try_convert = decltype(To{declval()}); - } - templateclass Z, class...Ts> - using can_apply = details::can_apply; - - template - struct is_convertible - : conditional < - can_apply ::value - , true_type - , typename conditional < - is_arithmetic::value && is_arithmetic::value, - true_type, - false_type - >::type - >::type - {}; - - template<> - struct is_convertible : true_type{}; - - - // primary template - template - struct is_function : false_type { }; - // specialization for regular functions - template - struct is_function : true_type {}; - // specialization for variadic functions such as printf - template - struct is_function : true_type {}; - // specialization for function types that have cv-qualifiers - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - // specialization for function types that have ref-qualifiers - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - template - struct is_function : true_type {}; - - - template - struct is_empty : public integral_constant { }; - - - template - class decay - { - typedef typename remove_reference::type U; - public: - typedef typename conditional< - is_array::value, - typename remove_extent::type*, - typename conditional< - is_function::value, - typename add_pointer::type, - typename remove_cv::type - >::type - >::type type; - }; - - - namespace details - { - template struct tag { using type=T; }; - template using type_t = typename Tag::type; - - template - using invoke_t = decltype( declval()(declval()...) ); - - template - struct result_of {}; - template - struct result_of>> - : tag > - {}; - } - template - using result_of = details::result_of; - -} } // namespace arx::stdx - -#endif // Do not have libstdc++11 - - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201402L // Have libstdc++14 - -#else // Do not have libstdc++14 - -namespace arx { namespace stdx { - - // `move` must be declared before including `functional.h` - // C++14 constexpr version should be inside of C++14, - // but moved before `functional.h` - template - constexpr typename remove_reference::type&& move(T&& t) noexcept - { - return static_cast::type&&>(t); - } - -} } // namespace arx::stdx - -#endif // Do not have libstdc++14 - - -#include "initializer_list.h" -#include "tuple.h" -#include "functional.h" - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201402L // Have libstdc++14 - // Nothing to include here, relevant header files were already included - // for C++11 above. -#else // Do not have libstdc++14 - -namespace arx { namespace stdx { - - template - using enable_if_t = typename enable_if::type; - - template - using decay_t = typename decay::type; - - template - using remove_cv_t = typename remove_cv::type; - template - using remove_const_t = typename remove_const::type; - template - using remove_volatile_t = typename remove_volatile::type; - template - using remove_reference_t = typename remove_reference::type; - template - using remove_pointer_t = typename remove_pointer::type; - - template - struct integer_sequence - { - using type = integer_sequence; - using value_type = T; - static constexpr size_t size() noexcept { return sizeof...(Ts); } - }; - template - using index_sequence = integer_sequence; - - // https://stackoverflow.com/questions/17424477/implementation-c14-make-integer-sequence - - template - struct concat_impl; - template - using concat = typename concat_impl::type; - - template - struct concat_impl , index_sequence> - : index_sequence {}; - template - struct make_index_sequence_impl; - template - using make_index_sequence = typename make_index_sequence_impl::type; - template - struct make_index_sequence_impl - : concat, make_index_sequence > {}; - template<> - struct make_index_sequence_impl <0> : index_sequence<>{}; - template<> - struct make_index_sequence_impl <1> : index_sequence<0>{}; - - template - using index_sequence_for = make_index_sequence; - -} } // namespace arx::stdx - -#endif // Do not have libstdc++14 - - -#if ARX_HAVE_LIBSTDCPLUSPLUS >= 201703L // Have libstdc++17 - // Nothing to include here, relevant header files were already included - // for C++11 above. -#else // Do not have libstdc++17 - -namespace arx { namespace stdx { - - template - struct Tester { using type = void; }; - template - using void_t = typename Tester::type; - - template - struct disjunction : false_type {}; - template - struct disjunction : Arg::type {}; - template - struct disjunction : conditional>::type {}; - - template - struct conjunction : true_type {}; - template - struct conjunction : Arg::type {}; - template - struct conjunction : conditional, Arg>::type {}; - - template - struct negation : integral_constant {}; - - // https://qiita.com/_EnumHack/items/92e6e135174f1f781dbb - // without decltype(auto) - - template - constexpr auto apply_impl(F&& f, Tuple&& t, index_sequence) - -> decltype(f(get(forward(t))...)) - { - return f(get(forward(t))...); - } - template - constexpr auto apply(F&& f, Tuple&& t) - -> decltype(apply_impl( - forward(f), - forward(t), - make_index_sequence>::value>{} - )) - { - return apply_impl( - forward(f), - forward(t), - make_index_sequence>::value>() - ); - } - -} } // namespace arx::stdx - -#endif // Do not have libstdc++17 - - -#if ARX_HAVE_LIBSTDCPLUSPLUS > 201703L // Have libstdc++2a - // Nothing to include here, relevant header files were already included - // for C++11 above. -#else // Do not have libstdc++2a - -namespace arx { namespace stdx { - - template - struct remove_cvref - { - typedef remove_cv_t> type; - }; - - template< class T > - using remove_cvref_t = typename remove_cvref::type; - -} } // namespace arx::stdx -#endif // Do not have libstdc++2a - - -namespace arx { // others - - template class Check, class... T> - struct is_detected_impl : std::false_type {}; - template