Created
July 16, 2021 15:38
-
-
Save wolfram77/50865b579cdba5241f0716642c08448c to your computer and use it in GitHub Desktop.
Trying this out, but too big, instead i will modify where i need it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #pragma once | |
| #include <array> | |
| #include <vector> | |
| using std::array; | |
| using std::vector; | |
| template <class T, size_t C=128> | |
| class SmallVector { | |
| array<T, C> s; // small | |
| vector<T> l; // large | |
| size_t N; | |
| // Cute helpers. | |
| constexpr bool is() const { return N<=C; } // small? | |
| // Member types. | |
| using value_type = vector<T>::value_type; | |
| using size_type = vector<T>::size_type; | |
| using difference_type = vector<T>::difference_type; | |
| using reference = vector<T>::reference; | |
| using const_reference = vector<T>::const_reference; | |
| using pointer = vector<T>::pointer; | |
| using const_pointer = vector<T>::const_pointer; | |
| using iterator = vector<T>::iterator; | |
| using const_iterator = vector<T>::const_iterator; | |
| using reverse_iterator = vector<T>::reverse_iterator; | |
| using const_reverse_iterator = vector<T>::const_reverse_iterator; | |
| // Element access. | |
| public: | |
| constexpr T& at(size_t i) { return is()? s.at(i) : l.at(i); } | |
| constexpr const T& at(size_t i) const { return is()? s.at(i) : l.at(i); } | |
| constexpr T& operator[](size_t i) { return is()? s[i] : l[i]; } | |
| constexpr const T& operator[](size_t i) const { return is()? s[i] : l[i]; } | |
| constexpr T& front() { return is()? s.front() : l.front(); } | |
| constexpr const T& front() const { return is()? s.front() : l.front(); } | |
| constexpr T& back() { return is()? s.back() : l.back(); } | |
| constexpr const T& back() const { return is()? s.back() : l.back(); } | |
| constexpr T* data() { return is()? s.data() : l.data(); } | |
| constexpr const T* data() const { return is()? s.data() : l.data(); } | |
| // Iterators. | |
| public: | |
| constexpr iterator begin() noexcept { return is()? s.begin() : l.begin(); } | |
| constexpr const_iterator begin() const noexcept { return is()? s.begin() : l.begin(); } | |
| constexpr const_iterator cbegin() const noexcept { return is()? s.cbegin() : l.cbegin(); } | |
| constexpr iterator end() noexcept { return is()? s.end() : l.end(); } | |
| constexpr const_iterator end() const noexcept { return is()? s.end() : l.end(); } | |
| constexpr const_iterator cend() const noexcept { return is()? s.cend() : l.cend(); } | |
| constexpr reverse_iterator rbegin() noexcept { return is()? s.rbegin() : l.rbegin(); } | |
| constexpr const_reverse_iterator rbegin() const noexcept { return is()? s.rbegin() : l.rbegin(); } | |
| constexpr const_reverse_iterator crbegin() const noexcept { return is()? s.crbegin() : l.crbegin(); } | |
| constexpr reverse_iterator rend() noexcept { return is()? s.rend() : l.rend(); } | |
| constexpr const_reverse_iterator rend() const noexcept { return is()? s.rend() : l.rend(); } | |
| constexpr const_reverse_iterator crend() const noexcept { return is()? s.crend() : l.crend(); } | |
| // Non-member functions. | |
| public: | |
| bool operator==(const SmallVector<T, C>& l, const SmallVector<T, C>& r) { | |
| } | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment