byte_array.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #ifndef BYTE_ARRAY_H
  2. #define BYTE_ARRAY_H
  3. #include "ctypes.h"
  4. #include "mem.h"
  5. #include <cstring>
  6. namespace binom {
  7. class ByteArrayView;
  8. class ByteArray {
  9. protected:
  10. ui64 _length = 0;
  11. byte* array = nullptr;
  12. friend class ByteArrayView;
  13. public:
  14. typedef byte* iterator;
  15. typedef const byte* const_iterator;
  16. ByteArray() = default;
  17. ByteArray(decltype(nullptr)) : ByteArray() {}
  18. ByteArray(const void* buffer, ui64 size);
  19. ByteArray(const ByteArray& other);
  20. ByteArray(ByteArray&& other);
  21. ByteArray(ui64 size);
  22. ByteArray(std::initializer_list<const ByteArray> arrays);
  23. ByteArray(const ByteArrayView view);
  24. static ByteArray move(ByteArrayView view);
  25. static ByteArray move(const void* buffer, ui64 size);
  26. ~ByteArray();
  27. bool isEmpty() const;
  28. bool isEqual(const ByteArray& other) const;
  29. bool isEqual(ByteArray&& other) const;
  30. bool isEqual(ByteArrayView view) const;
  31. inline bool operator==(const ByteArray& other) {return isEqual(other);}
  32. inline bool operator==(ByteArray&& other) {return isEqual(other);}
  33. bool operator==(ByteArrayView other);
  34. inline bool operator!=(const ByteArray& other) {return !isEqual(other);}
  35. inline bool operator!=(ByteArray&& other) {return !isEqual(other);}
  36. bool operator!=(ByteArrayView other);
  37. template<typename Type>
  38. ui64 length() const {return _length/sizeof(Type);}
  39. ui64 length() const;
  40. void reset(ui64 new_length);
  41. void resize(ui64 new_length);
  42. iterator addSize(ui64 add);
  43. iterator addSizeFront(ui64 add);
  44. iterator addSizeTo(ui64 to, ui64 add);
  45. void subSize(ui64 sub);
  46. template<typename Type>
  47. ByteArray& pushBack(const Type& value) {return pushBack(&value, sizeof (Type));}
  48. ByteArray& pushBack(byte b);
  49. ByteArray& pushBack(const char* c_str);
  50. ByteArray& pushBack(const void* buffer, ui64 size);
  51. ByteArray& pushBack(const ByteArray& byte_array);
  52. ByteArray& pushBack(const ByteArray&& byte_array);
  53. template<typename Type>
  54. ByteArray& pushFront(const Type& value) {return pushFront(&value, sizeof (Type));}
  55. ByteArray& pushFront(byte b);
  56. ByteArray& pushFront(const char* c_str);
  57. ByteArray& pushFront(const void* buffer, ui64 size);
  58. ByteArray& pushFront(const ByteArray& byte_array);
  59. ByteArray& pushFront(const ByteArray&& byte_array);
  60. template<typename Type>
  61. ByteArray& insert(ui64 index, ui64 shift, Type type) { return insert(index*sizeof (Type) + shift, &type, sizeof(Type)); }
  62. ByteArray& insert(ui64 index, byte b);
  63. ByteArray& insert(ui64 index, const void* buffer, ui64 size);
  64. ByteArray& insert(ui64 index, const ByteArray& byte_array);
  65. ByteArray& insert(ui64 index, const ByteArray&& byte_array);
  66. template<typename Type>
  67. ByteArray& remove(ui64 index, ui64 shift, ui64 count = 1) { return remove(index*sizeof(Type)+shift, count*sizeof(Type)); }
  68. ByteArray& remove(ui64 index, ui64 size = 1);
  69. template<typename Type>
  70. Type& set(ui64 index, ui64 shift, Type value) { return get<Type>(index, shift) = value; }
  71. iterator set(ui64 index, ByteArray data);
  72. byte& set(ui64 index, byte value);
  73. template<typename Type>
  74. Type& get(ui64 index, ui64 shift = 0) const {return reinterpret_cast<Type*>(array + shift)[index];}
  75. byte& get(ui64 index) const;
  76. template<typename Type>
  77. Type& first() const {return *reinterpret_cast<Type*>(array);}
  78. byte& first() const;
  79. template<typename Type>
  80. Type& last() const {return *reinterpret_cast<Type*>(array + _length - sizeof (Type));}
  81. byte& last() const;
  82. template<typename Type>
  83. Type takeBackAs() {
  84. void* ptr = takeBack(sizeof(Type)).unfree();
  85. return *reinterpret_cast<Type*>(ptr);
  86. }
  87. template<typename Type>
  88. ByteArray takeFrontAs(){
  89. void* ptr = takeFront(sizeof(Type)).unfree();
  90. return *reinterpret_cast<Type*>(ptr);
  91. }
  92. ByteArray takeBack(ui64 size);
  93. ByteArray takeFront(ui64 size);
  94. template<typename Type>
  95. ByteArray takeFrom(ui64 index, ui64 count) {return takeFrom(index * sizeof (Type), count * sizeof (Type));}
  96. ByteArray takeFrom(ui64 index, ui64 size);
  97. template<typename Type>
  98. Type takeBack() {
  99. if(sizeof (Type) > _length) throw Exception(ErrCode::any);
  100. Type _new;
  101. memcpy(&_new, end()-sizeof(Type), sizeof(Type));
  102. _length -= sizeof(Type);
  103. return _new;
  104. }
  105. template<typename Type>
  106. Type takeFront() {
  107. if(sizeof (Type) > _length) throw Exception(ErrCode::any);
  108. Type _new;
  109. memcpy(&_new, begin(), sizeof (Type));
  110. _length -= sizeof (Type);
  111. memmove(begin(), begin() + sizeof (Type), _length);
  112. array = tryRealloc<byte>(array, _length);
  113. return _new;
  114. }
  115. ui64 pointerToIndex(void* pos);
  116. template<typename Type>
  117. Type* begin(ui64 shift = 0) const {return reinterpret_cast<Type*>(array + shift);}
  118. iterator begin() const;
  119. const_iterator cbegin() const;
  120. template<typename Type>
  121. Type* end() const {return reinterpret_cast<Type*>(array) + length<Type>();}
  122. iterator end() const;
  123. const_iterator cend() const;
  124. void* unfree();
  125. void* pointer() {return array;}
  126. void free();
  127. void split(ui64 second_start, ByteArray& first, ByteArray& second);
  128. std::string toStdString();
  129. ByteArray& operator=(ByteArray other);
  130. byte& operator[](ui64 index);
  131. ByteArray& operator+=(byte b);
  132. ByteArray& operator+=(ByteArray byte_array);
  133. ByteArray& operator+=(const char* c_str);
  134. ByteArray operator+(byte b);
  135. ByteArray operator+(ByteArray byte_array);
  136. ByteArray operator+(const char* c_str);
  137. template<typename Type>
  138. ByteArray& operator+=(const Type& data) {return pushBack(data);}
  139. operator ByteArrayView() const;
  140. };
  141. class ByteArrayView : public ByteArray {
  142. public:
  143. ByteArrayView() : ByteArray() {}
  144. ByteArrayView(decltype(nullptr)) : ByteArray() {}
  145. ByteArrayView(const void* buffer, ui64 size) {array = (byte*)buffer; _length = size;}
  146. ByteArrayView(const ByteArray& other) {array = other.array; _length = other._length;}
  147. ByteArrayView(ByteArray&& other) {array = other.array; _length = other._length;}
  148. ByteArrayView(const ByteArrayView& other) {array = other.array; _length = other._length;}
  149. ByteArrayView(ByteArrayView&& other) {array = other.array; _length = other._length;}
  150. ~ByteArrayView() {array = nullptr;}
  151. };
  152. }
  153. #endif // BYTE_ARRAY_H