LCOV - code coverage report
Current view: top level - core/core/string - SPBytesView.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 129 132 97.7 %
Date: 2024-05-12 00:16:13 Functions: 74 84 88.1 %

          Line data    Source code
       1             : /**
       2             : Copyright (c) 2016-2022 Roman Katuntsev <sbkarr@stappler.org>
       3             : Copyright (c) 2023 Stappler LLC <admin@stappler.dev>
       4             : 
       5             : Permission is hereby granted, free of charge, to any person obtaining a copy
       6             : of this software and associated documentation files (the "Software"), to deal
       7             : in the Software without restriction, including without limitation the rights
       8             : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       9             : copies of the Software, and to permit persons to whom the Software is
      10             : furnished to do so, subject to the following conditions:
      11             : 
      12             : The above copyright notice and this permission notice shall be included in
      13             : all copies or substantial portions of the Software.
      14             : 
      15             : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      16             : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      17             : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      18             : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      19             : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      20             : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      21             : THE SOFTWARE.
      22             : **/
      23             : 
      24             : #ifndef STAPPLER_CORE_STRING_SPDATAREADER_H_
      25             : #define STAPPLER_CORE_STRING_SPDATAREADER_H_
      26             : 
      27             : #include "SPByteOrder.h"
      28             : #include "SPStringView.h"
      29             : #include "SPHalfFloat.h"
      30             : 
      31             : namespace STAPPLER_VERSIONIZED stappler {
      32             : 
      33             : template <Endian Endianess = Endian::Network>
      34             : class BytesViewTemplate : public BytesReader<uint8_t> {
      35             : public:
      36             :         template <class T>
      37             :         using Converter = byteorder::ConverterTraits<Endianess, T>;
      38             : 
      39             :         using Self = BytesViewTemplate<Endianess>;
      40             : 
      41             :         using PoolBytes = typename memory::PoolInterface::BytesType;
      42             :         using StdBytes = typename memory::StandartInterface::BytesType;
      43             : 
      44             :         constexpr BytesViewTemplate();
      45             :         constexpr BytesViewTemplate(const uint8_t *p, size_t l);
      46             :         constexpr BytesViewTemplate(StringView);
      47             : 
      48             :         BytesViewTemplate(const PoolBytes &vec);
      49             :         BytesViewTemplate(const StdBytes &vec);
      50             : 
      51             :         template <size_t Size>
      52             :         constexpr BytesViewTemplate(const std::array<uint8_t, Size> &arr);
      53             : 
      54             :         template<Endian OtherEndianess>
      55             :         constexpr BytesViewTemplate(const BytesViewTemplate<OtherEndianess> &vec);
      56             : 
      57             :         template<Endian OtherEndianess>
      58             :         constexpr BytesViewTemplate(const BytesViewTemplate<OtherEndianess>, size_t len);
      59             : 
      60             :         template<Endian OtherEndianess>
      61             :         constexpr BytesViewTemplate(const BytesViewTemplate<OtherEndianess>, size_t pos, size_t len);
      62             : 
      63             :         Self & operator =(const PoolBytes &b);
      64             :         Self & operator =(const StdBytes &b);
      65             :         Self & operator =(const Self &b);
      66             : 
      67             :         Self & set(const PoolBytes &vec);
      68             :         Self & set(const StdBytes &vec);
      69             :         Self & set(const Self &vec);
      70             :         Self & set(const uint8_t *p, size_t l);
      71             : 
      72             :         Self & operator ++ ();
      73             :         Self & operator ++ (int);
      74             :         Self & operator += (size_t l);
      75             : 
      76             :         bool operator == (const Self &other) const;
      77             :         bool operator != (const Self &other) const;
      78             : 
      79             :         Self pdup(memory::pool_t * = nullptr) const;
      80             : 
      81             :         template <typename Interface>
      82             :         auto bytes() const -> typename Interface::BytesType;
      83             : 
      84         127 :         constexpr Self sub(size_t pos = 0, size_t len = maxOf<size_t>()) const { return Self(*this, pos, len); }
      85             : 
      86             : private:
      87             :         template <typename T>
      88             :         auto convert(const uint8_t *data) -> T;
      89             : 
      90             :         bool match (CharType c) { return false; }
      91             :         template <uint8_t Arg, uint8_t ... Args> bool match (CharType c);
      92             : 
      93             : public:
      94             :         template<uint8_t ... Args> void skipChars();
      95             :         template<uint8_t ... Args> void skipUntil();
      96             : 
      97             :         template<uint8_t ... Args> void backwardSkipChars();
      98             :         template<uint8_t ... Args> void backwardSkipUntil();
      99             : 
     100             :         template<uint8_t ... Args> Self readChars();
     101             :         template<uint8_t ... Args> Self readUntil();
     102             : 
     103             :         template<uint8_t ... Args> Self backwardReadChars();
     104             :         template<uint8_t ... Args> Self backwardReadUntil();
     105             : 
     106             :         template <uint8_t ... Args> void trimChars();
     107             :         template <uint8_t ... Args> void trimUntil();
     108             : 
     109             :         template<typename Separator, typename Callback> void split(const Callback &cb) const;
     110             : 
     111             :         uint64_t readUnsigned64();
     112             :         uint32_t readUnsigned32();
     113             :         uint32_t readUnsigned24();
     114             :         uint16_t readUnsigned16();
     115             :         uint8_t readUnsigned();
     116             : 
     117             :         double readFloat64();
     118             :         float readFloat32();
     119             :         float readFloat16();
     120             : 
     121             :         StringView readString(); // read null-terminated string
     122             :         StringView readString(size_t s); // read fixed-size string
     123             : 
     124             :         StringView toStringView() const;
     125             : 
     126             :         template<Endian OtherEndianess = Endianess>
     127             :         auto readBytes(size_t s) -> BytesViewTemplate<OtherEndianess>; // read fixed-size string
     128             : };
     129             : 
     130             : using BytesView = BytesViewTemplate<Endian::Host>;
     131             : using BytesViewNetwork = BytesViewTemplate<Endian::Network>;
     132             : using BytesViewHost = BytesViewTemplate<Endian::Host>;
     133             : 
     134             : template <Endian Endianess>
     135      877383 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate() { }
     136             : 
     137             : template <Endian Endianess>
     138     2545972 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(const uint8_t *p, size_t l)
     139     2545972 : : BytesReader(p, l) { }
     140             : 
     141             : template <Endian Endianess>
     142         900 : BytesViewTemplate<Endianess>::BytesViewTemplate(const PoolBytes &vec)
     143         900 : : BytesReader(vec.data(), vec.size()) { }
     144             : 
     145             : template <Endian Endianess>
     146      448860 : BytesViewTemplate<Endianess>::BytesViewTemplate(const StdBytes &vec)
     147      448860 : : BytesReader(vec.data(), vec.size()) { }
     148             : 
     149             : template <Endian Endianess>
     150        1650 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(StringView str)
     151        1650 : : BytesReader((const uint8_t *)str.data(), str.size()) { }
     152             : 
     153             : template <Endian Endianess>
     154             : template <size_t Size>
     155        1225 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(const std::array<uint8_t, Size> &arr)
     156        1225 : : BytesReader(arr.data(), Size) { }
     157             : 
     158             : template <Endian Endianess>
     159             : template<Endian OtherEndianess>
     160      553381 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(const BytesViewTemplate<OtherEndianess> &data)
     161      553381 : : BytesReader(data.data(), data.size()) { }
     162             : 
     163             : template <Endian Endianess>
     164             : template<Endian OtherEndianess>
     165         775 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(const BytesViewTemplate<OtherEndianess> ptr, size_t len)
     166         775 : : BytesReader(ptr.data(), min(len, ptr.size())) { }
     167             : 
     168             : template <Endian Endianess>
     169             : template<Endian OtherEndianess>
     170         152 : inline constexpr BytesViewTemplate<Endianess>::BytesViewTemplate(const BytesViewTemplate<OtherEndianess> ptr, size_t pos, size_t len)
     171         152 : : BytesReader(ptr.data() + pos, min(len, ptr.size() - pos)) { }
     172             : 
     173             : 
     174             : template <Endian Endianess>
     175             : auto BytesViewTemplate<Endianess>::operator =(const PoolBytes &b) -> Self & {
     176             :         return set(b);
     177             : }
     178             : 
     179             : template <Endian Endianess>
     180          80 : auto BytesViewTemplate<Endianess>::operator =(const StdBytes &b) -> Self & {
     181          80 :         return set(b);
     182             : }
     183             : 
     184             : template <Endian Endianess>
     185       45472 : auto BytesViewTemplate<Endianess>::operator =(const Self &b) -> Self & {
     186       45472 :         return set(b);
     187             : }
     188             : 
     189             : template <Endian Endianess>
     190             : auto BytesViewTemplate<Endianess>::set(const PoolBytes &vec) -> Self & {
     191             :         ptr = vec.data();
     192             :         len = vec.size();
     193             :         return *this;
     194             : }
     195             : 
     196             : template <Endian Endianess>
     197          80 : auto BytesViewTemplate<Endianess>::set(const StdBytes &vec) -> Self & {
     198          80 :         ptr = vec.data();
     199          80 :         len = vec.size();
     200          80 :         return *this;
     201             : }
     202             : 
     203             : template <Endian Endianess>
     204       45472 : auto BytesViewTemplate<Endianess>::set(const Self &vec) -> Self & {
     205       45472 :         ptr = vec.data();
     206       45472 :         len = vec.size();
     207       45470 :         return *this;
     208             : }
     209             : 
     210             : template <Endian Endianess>
     211             : auto BytesViewTemplate<Endianess>::set(const uint8_t *p, size_t l) -> Self & {
     212             :         ptr = p;
     213             :         len = l;
     214             :         return *this;
     215             : }
     216             : 
     217             : template <Endian Endianess>
     218       20675 : auto BytesViewTemplate<Endianess>::operator ++ () -> Self & {
     219       20675 :         if (len > 0) {
     220       20675 :                 ptr ++; len --;
     221             :         }
     222       20675 :         return *this;
     223             : }
     224             : 
     225             : template <Endian Endianess>
     226       25325 : auto BytesViewTemplate<Endianess>::operator ++ (int) -> Self & {
     227       25325 :         if (len > 0) {
     228       25325 :                 ptr ++; len --;
     229             :         }
     230       25325 :         return *this;
     231             : }
     232             : 
     233             : template <Endian Endianess>
     234     4489668 : auto BytesViewTemplate<Endianess>::operator += (size_t l) -> Self & {
     235     4489668 :         if (len > 0) {
     236     4488843 :                 offset(l);
     237             :         }
     238     4489668 :         return *this;
     239             : }
     240             : 
     241             : template <Endian Endianess>
     242        1325 : auto BytesViewTemplate<Endianess>::operator == (const Self &other) const -> bool {
     243        1325 :         return len == other.len && (ptr == other.ptr || memcmp(ptr, other.ptr, len * sizeof(CharType)) == 0);
     244             : }
     245             : 
     246             : template <Endian Endianess>
     247         975 : auto BytesViewTemplate<Endianess>::operator != (const Self &other) const -> bool {
     248         975 :         return !(*this == other);
     249             : }
     250             : 
     251             : template <Endian Endianess>
     252         125 : auto BytesViewTemplate<Endianess>::pdup(memory::pool_t *p) const -> Self {
     253         125 :         if (!p) {
     254           0 :                 p = memory::pool::acquire();
     255             :         }
     256         125 :         auto buf = (uint8_t *)memory::pool::palloc(p, this->size() * sizeof(uint8_t));
     257         125 :         memcpy(buf, this->data(), this->size() * sizeof(uint8_t));
     258         125 :         return Self(buf, this->size());
     259             : }
     260             : 
     261             : template <Endian Endianess>
     262             : template <typename Interface>
     263        5680 : auto BytesViewTemplate<Endianess>::bytes() const -> typename Interface::BytesType {
     264        5680 :         return typename Interface::BytesType(data(), data() + size());
     265             : }
     266             : 
     267             : template <Endian Endianess>
     268             : template <typename T>
     269    23399047 : auto BytesViewTemplate<Endianess>::convert(const uint8_t *data) -> T {
     270             :         T res;
     271    23399047 :         memcpy(&res, data, sizeof(T));
     272    46741693 :         return Converter<T>::Swap(res);
     273             : };
     274             : 
     275             : template <Endian Endianess>
     276             : template<uint8_t ... Args>
     277             : auto BytesViewTemplate<Endianess>::skipChars() -> void {
     278             :         size_t offset = 0;
     279             :         while (this->len > offset && match<Args...>(this->ptr[offset])) {
     280             :                 ++offset;
     281             :         }
     282             :         auto off = std::min(offset, this->len);
     283             :         this->len -= off;
     284             :         this->ptr += off;
     285             : }
     286             : 
     287             : template <Endian Endianess>
     288             : template<uint8_t ... Args>
     289       38775 : auto BytesViewTemplate<Endianess>::skipUntil() -> void {
     290       38775 :         size_t offset = 0;
     291     2356950 :         while (this->len > offset && !match<Args...>(this->ptr[offset])) {
     292     2318175 :                 ++offset;
     293             :         }
     294       38775 :         auto off = std::min(offset, this->len);
     295       38775 :         this->len -= off;
     296       38775 :         this->ptr += off;
     297       38775 : }
     298             : 
     299             : template <Endian Endianess>
     300             : template<uint8_t ... Args>
     301             : auto BytesViewTemplate<Endianess>::backwardSkipChars() -> void {
     302             :         while (this->len > 0 && match<Args...>(this->ptr[this->len - 1])) {
     303             :                 -- this->len;
     304             :         }
     305             : }
     306             : 
     307             : template <Endian Endianess>
     308             : template<uint8_t ... Args>
     309             : auto BytesViewTemplate<Endianess>::backwardSkipUntil() -> void {
     310             :         while (this->len > 0 && !match<Args...>(this->ptr[this->len - 1])) {
     311             :                 -- this->len;
     312             :         }
     313             : }
     314             : 
     315             : template <Endian Endianess>
     316             : template <uint8_t ... Args>
     317             : auto BytesViewTemplate<Endianess>::readChars() -> Self {
     318             :         auto tmp = *this;
     319             :         skipChars<Args ...>();
     320             :         return Self(tmp.data(), tmp.size() - this->size());
     321             : }
     322             : 
     323             : template <Endian Endianess>
     324             : template <uint8_t ... Args>
     325       38775 : auto BytesViewTemplate<Endianess>::readUntil() -> Self {
     326       38775 :         auto tmp = *this;
     327       38775 :         skipUntil<Args ...>();
     328       38775 :         return Self(tmp.data(), tmp.size() - this->size());
     329             : }
     330             : 
     331             : template <Endian Endianess>
     332             : template<uint8_t ... Args>
     333             : auto BytesViewTemplate<Endianess>::backwardReadChars() -> Self {
     334             :         auto tmp = *this;
     335             :         backwardSkipChars<Args ...>();
     336             :         return Self(this->data() + this->size(), tmp.size() - this->size());
     337             : }
     338             : 
     339             : template <Endian Endianess>
     340             : template<uint8_t ... Args>
     341             : auto BytesViewTemplate<Endianess>::backwardReadUntil() -> Self {
     342             :         auto tmp = *this;
     343             :         backwardSkipUntil<Args ...>();
     344             :         return Self(this->data() + this->size(), tmp.size() - this->size());
     345             : }
     346             : 
     347             : template <Endian Endianess>
     348             : template<typename Separator, typename Callback>
     349             : auto BytesViewTemplate<Endianess>::split(const Callback &cb) const -> void {
     350             :         Self str(*this);
     351             :         while (!str.empty()) {
     352             :                 str.skipChars<Separator>();
     353             :                 auto tmp = str.readUntil<Separator>();
     354             :                 if (!tmp.empty()) {
     355             :                         cb(tmp);
     356             :                 }
     357             :         }
     358             : }
     359             : 
     360             : template <Endian Endianess>
     361             : template<uint8_t ... Args>
     362             : auto BytesViewTemplate<Endianess>::trimChars() -> void {
     363             :         this->skipChars<Args...>();
     364             :         if (!this->empty()) {
     365             :                 this->backwardSkipChars<Args...>();
     366             :         }
     367             : }
     368             : 
     369             : template <Endian Endianess>
     370             : template <uint8_t... Args>
     371             : auto BytesViewTemplate<Endianess>::trimUntil() -> void {
     372             :         this->skipUntil<Args...>();
     373             :         if (!this->empty()) {
     374             :                 this->backwardSkipUntil<Args...>();
     375             :         }
     376             : }
     377             : 
     378             : template <Endian Endianess>
     379             : template <uint8_t Arg, uint8_t ...Args>
     380     2356725 : auto BytesViewTemplate<Endianess>::match(CharType c) -> bool {
     381     2356725 :         if (c == Arg) {
     382       38550 :                 return true;
     383             :         }
     384             :         if constexpr (sizeof...(Args) > 0) {
     385             :                 return match<Args...>(c);
     386             :         }
     387     2318175 :         return false;
     388             : }
     389             : 
     390             : template <Endian Endianess>
     391       10450 : auto BytesViewTemplate<Endianess>::readUnsigned64() -> uint64_t {
     392       10450 :         uint64_t ret = 0;
     393       10450 :         if (len >= 8) {
     394       10450 :                 ret = convert<uint64_t>(ptr);
     395       10450 :                 ptr += 8; len -= 8;
     396             :         }
     397       10450 :         return ret;
     398             : }
     399             : 
     400             : template <Endian Endianess>
     401      268120 : auto BytesViewTemplate<Endianess>::readUnsigned32() -> uint32_t {
     402      268120 :         uint32_t ret = 0;
     403      268120 :         if (len >= 4) {
     404      268120 :                 ret = convert<uint32_t>(ptr);
     405      268119 :                 ptr += 4; len -= 4;
     406             :         }
     407      268119 :         return ret;
     408             : }
     409             : 
     410             : template <Endian Endianess>
     411         325 : auto BytesViewTemplate<Endianess>::readUnsigned24() -> uint32_t {
     412         325 :         uint32_t ret = 0;
     413         325 :         if (len >= 3) {
     414         325 :                 ret = (*ptr << 16) + (*(ptr + 1) << 8) + *(ptr + 2);
     415         325 :                 ptr += 3; len -= 3;
     416             :         }
     417         325 :         return ret;
     418             : }
     419             : 
     420             : template <Endian Endianess>
     421     4514981 : auto BytesViewTemplate<Endianess>::readUnsigned16() -> uint16_t {
     422     4514981 :         uint16_t ret = 0;
     423     4514981 :         if (len >= 2) {
     424     4514956 :                 ret = convert<uint16_t>(ptr);
     425     4514957 :                 ptr += 2; len -= 2;
     426             :         }
     427     4514982 :         return ret;
     428             : }
     429             : 
     430             : template <Endian Endianess>
     431    80574947 : auto BytesViewTemplate<Endianess>::readUnsigned() -> uint8_t {
     432    80574947 :         uint8_t ret = 0;
     433    80574947 :         if (len > 0) { ret = *ptr; ++ ptr; -- len; }
     434    80574947 :         return ret;
     435             : }
     436             : 
     437             : template <Endian Endianess>
     438        1325 : auto BytesViewTemplate<Endianess>::readFloat64() -> double{
     439        1325 :         double ret = 0;
     440        1325 :         if (len >= 8) {
     441        1325 :                 ret = convert<double>(ptr);
     442        1325 :                 ptr += 8; len -= 8;
     443             :         }
     444        1325 :         return ret;
     445             : }
     446             : 
     447             : template <Endian Endianess>
     448    18604198 : auto BytesViewTemplate<Endianess>::readFloat32() -> float {
     449    18604198 :         float ret = 0; if (len >= 4) {
     450    18604198 :                 ret = convert<float>(ptr);
     451    18604198 :                 ptr += 4; len -= 4;
     452             :         }
     453    18604198 :         return ret;
     454             : }
     455             : 
     456             : template <Endian Endianess>
     457     3717009 : auto BytesViewTemplate<Endianess>::readFloat16() -> float {
     458     3717009 :         return halffloat::decode(readUnsigned16());
     459             : }
     460             : 
     461             : // read null-terminated string
     462             : template <Endian Endianess>
     463             : auto BytesViewTemplate<Endianess>::readString() -> StringView {
     464             :         size_t offset = 0; while (len - offset && ptr[offset]) { offset ++; }
     465             :         StringView ret((const char *)ptr, offset);
     466             :         ptr += offset; len -= offset;
     467             :         if (len && *ptr == 0) { ++ ptr; -- len; }
     468             :         return ret;
     469             : }
     470             : 
     471             : // read fixed-size string
     472             : template <Endian Endianess>
     473        4675 : auto BytesViewTemplate<Endianess>::readString(size_t s) -> StringView {
     474        4675 :         if (len < s) {
     475           0 :                 s = len;
     476             :         }
     477        4675 :         StringView ret((const char *)ptr, s);
     478        4675 :         ptr += s; len -= s;
     479        4675 :         return ret;
     480             : }
     481             : 
     482             : template <Endian Endianess>
     483       49850 : auto BytesViewTemplate<Endianess>::toStringView() const -> StringView {
     484       49850 :         return StringView((const char *)ptr, len);
     485             : }
     486             : 
     487             : template <Endian Endianess>
     488             : template <Endian Target>
     489        4450 : auto BytesViewTemplate<Endianess>::readBytes(size_t s) -> BytesViewTemplate<Target> {
     490        4450 :         if (len < s) {
     491           0 :                 s = len;
     492             :         }
     493        4450 :         BytesViewTemplate<Target> ret(ptr, s);
     494        4450 :         ptr += s; len -= s;
     495        4450 :         return ret;
     496             : }
     497             : 
     498             : 
     499             : 
     500             : template <typename Compare>
     501             : inline int compareDataRanges(const uint8_t *l, size_t __lsize,  const uint8_t *r, size_t __rsize, const Compare &cmp) {
     502             :         return std::lexicographical_compare(l, l + __lsize, r, r + __rsize, cmp);
     503             : }
     504             : 
     505             : template <Endian Endianess>
     506             : inline bool operator== (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     507             :         return BytesViewTemplate<Endianess>(l) == r;
     508             : }
     509             : 
     510             : template <Endian Endianess>
     511             : inline bool operator== (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     512             :         return BytesViewTemplate<Endianess>(l) == r;
     513             : }
     514             : 
     515             : template <Endian Endianess, size_t Size>
     516         200 : inline bool operator== (const std::array<uint8_t, Size> &l, const BytesViewTemplate<Endianess> &r) {
     517         200 :         return BytesViewTemplate<Endianess>(l) == r;
     518             : }
     519             : 
     520             : template <Endian Endianess>
     521             : inline bool operator== (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     522             :         return l == BytesViewTemplate<Endianess>(r);
     523             : }
     524             : 
     525             : template <Endian Endianess>
     526             : inline bool operator== (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     527             :         return l == BytesViewTemplate<Endianess>(r);
     528             : }
     529             : 
     530             : template <Endian Endianess, size_t Size>
     531             : inline bool operator== (const BytesViewTemplate<Endianess> &l, const std::array<uint8_t, Size> &r) {
     532             :         return l == BytesViewTemplate<Endianess>(r);
     533             : }
     534             : 
     535             : 
     536             : template <Endian Endianess>
     537             : inline bool operator!= (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     538             :         return BytesViewTemplate<Endianess>(l) != r;
     539             : }
     540             : 
     541             : template <Endian Endianess>
     542         325 : inline bool operator!= (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     543         325 :         return BytesViewTemplate<Endianess>(l) != r;
     544             : }
     545             : 
     546             : template <Endian Endianess, size_t Size>
     547             : inline bool operator!= (const std::array<uint8_t, Size> &l, const BytesViewTemplate<Endianess> &r) {
     548             :         return BytesViewTemplate<Endianess>(l) != r;
     549             : }
     550             : 
     551             : template <Endian Endianess>
     552             : inline bool operator!= (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     553             :         return l != BytesViewTemplate<Endianess>(r);
     554             : }
     555             : 
     556             : template <Endian Endianess>
     557             : inline bool operator!= (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     558             :         return l != BytesViewTemplate<Endianess>(r);
     559             : }
     560             : 
     561             : template <Endian Endianess, size_t Size>
     562             : inline bool operator!= (const BytesViewTemplate<Endianess> &l, const std::array<uint8_t, Size> &r) {
     563             :         return l != BytesViewTemplate<Endianess>(r);
     564             : }
     565             : 
     566             : 
     567             : template <Endian Endianess>
     568             : inline bool operator< (const BytesViewTemplate<Endianess> &l, const BytesViewTemplate<Endianess> &r) {
     569             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less<uint8_t>());
     570             : }
     571             : 
     572             : template <Endian Endianess>
     573             : inline bool operator< (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     574             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less<uint8_t>());
     575             : }
     576             : 
     577             : template <Endian Endianess>
     578             : inline bool operator< (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     579             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less<uint8_t>());
     580             : }
     581             : 
     582             : template <Endian Endianess>
     583             : inline bool operator< (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     584             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less<uint8_t>());
     585             : }
     586             : 
     587             : template <Endian Endianess>
     588             : inline bool operator< (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     589             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less<uint8_t>());
     590             : }
     591             : 
     592             : 
     593             : template <Endian Endianess>
     594             : inline bool operator<= (const BytesViewTemplate<Endianess> &l, const BytesViewTemplate<Endianess> &r) {
     595             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less_equal<uint8_t>());
     596             : }
     597             : 
     598             : template <Endian Endianess>
     599             : inline bool operator<= (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     600             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less_equal<uint8_t>());
     601             : }
     602             : 
     603             : template <Endian Endianess>
     604             : inline bool operator<= (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     605             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less_equal<uint8_t>());
     606             : }
     607             : 
     608             : template <Endian Endianess>
     609             : inline bool operator<= (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     610             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less_equal<uint8_t>());
     611             : }
     612             : 
     613             : template <Endian Endianess>
     614             : inline bool operator<= (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     615             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::less_equal<uint8_t>());
     616             : }
     617             : 
     618             : 
     619             : template <Endian Endianess>
     620             : inline bool operator> (const BytesViewTemplate<Endianess> &l, const BytesViewTemplate<Endianess> &r) {
     621             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater<uint8_t>());
     622             : }
     623             : 
     624             : template <Endian Endianess>
     625             : inline bool operator> (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     626             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater<uint8_t>());
     627             : }
     628             : 
     629             : template <Endian Endianess>
     630             : inline bool operator> (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     631             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater<uint8_t>());
     632             : }
     633             : 
     634             : template <Endian Endianess>
     635             : inline bool operator> (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     636             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater<uint8_t>());
     637             : }
     638             : 
     639             : template <Endian Endianess>
     640             : inline bool operator> (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     641             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater<uint8_t>());
     642             : }
     643             : 
     644             : 
     645             : template <Endian Endianess>
     646             : inline bool operator>= (const BytesViewTemplate<Endianess> &l, const BytesViewTemplate<Endianess> &r) {
     647             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater_equal<uint8_t>());
     648             : }
     649             : 
     650             : template <Endian Endianess>
     651             : inline bool operator>= (const memory::PoolInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     652             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater_equal<uint8_t>());
     653             : }
     654             : 
     655             : template <Endian Endianess>
     656             : inline bool operator>= (const memory::StandartInterface::BytesType &l, const BytesViewTemplate<Endianess> &r) {
     657             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater_equal<uint8_t>());
     658             : }
     659             : 
     660             : template <Endian Endianess>
     661             : inline bool operator>= (const BytesViewTemplate<Endianess> &l, const memory::PoolInterface::BytesType &r) {
     662             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater_equal<uint8_t>());
     663             : }
     664             : 
     665             : template <Endian Endianess>
     666             : inline bool operator>= (const BytesViewTemplate<Endianess> &l, const memory::StandartInterface::BytesType &r) {
     667             :         return std::lexicographical_compare(l.data(), l.data() + l.size(), r.data(), r.data() + r.size(), std::greater_equal<uint8_t>());
     668             : }
     669             : 
     670             : }
     671             : 
     672             : #endif /* STAPPLER_CORE_UTILS_SPDATAREADER_H_ */

Generated by: LCOV version 1.14