9 #include "ypc/common/byte/base58.h"
10 #include "ypc/common/byte/base64.h"
11 #include "ypc/common/byte/bytes_common.h"
22 using byte_t = ByteType;
24 static_assert(
sizeof(ByteType) == 1,
25 "cannot use ByteType that with larger size than 1");
29 : m_value(std::unique_ptr<byte_t[]>(
new byte_t[len])), m_size(len) {}
32 memcpy(m_value.get(), v.m_value.get(), v.size());
39 if (v.m_value.size() == 0) {
43 if (m_size < v.size() || m_size > 2 * v.size()) {
44 m_value.reset(
new byte_t[v.size()]);
46 memcpy(m_value.get(), v.m_value.get(), v.size());
54 m_value = std::move(v.m_value);
60 : m_value(std::move(v.m_value)), m_size(v.size()) {}
64 m_value = std::unique_ptr<byte_t[]>(
new byte_t[l.size()]);
65 std::copy(l.begin(), l.end(), m_value.get());
69 template <
typename T>
bytes_base(
const T *v,
size_t len) {
70 static_assert(
sizeof(T) == 1,
"invalid pointer type");
73 m_value = std::unique_ptr<byte_t[]>(
new byte_t[len]);
74 memcpy(m_value.get(), v, len);
79 const byte_t &operator[](
size_t index)
const {
return m_value.get()[index]; }
80 byte_t &operator[](
size_t index) {
return m_value.get()[index]; }
82 inline size_t size()
const {
return m_size; }
83 inline const byte_t *data()
const {
84 if (
nullptr != m_value) {
89 inline byte_t *data() {
90 if (
nullptr != m_value) {
96 inline bool empty()
const {
return m_size == 0; }
99 if (v.m_size == m_size) {
100 if (memcmp(m_value.get(), v.m_value.get(), m_size) == 0) {
105 for (
size_t i = 0; i < m_size && i < v.m_size; i++) {
106 if (m_value[i] > v.m_value[i]) {
110 if (v.m_size < m_size) {
117 if (v.m_size == m_size) {
118 if (memcmp(m_value.get(), v.m_value.get(), m_size) == 0) {
123 for (
size_t i = 0; i < m_size && i < v.m_size; i++) {
124 if (m_value[i] < v.m_value[i]) {
128 if (v.m_size > m_size) {
135 std::unique_ptr<byte_t[]> m_value;
142 template <
typename ByteType,
byte_encode Format =
byte_encode::raw_
bytes>
145 using byte_t = ByteType;
146 const static byte_encode format = Format;
156 bytes(std::initializer_list<ByteType> l)
158 template <
typename T>
161 explicit bytes(
const char *str)
163 explicit bytes(
const std::string &str)
165 virtual ~
bytes() =
default;
167 template <
typename BytesType>
168 auto as()
const ->
typename std::enable_if<
169 std::is_same<typename BytesType::byte_t, ByteType>::value &&
170 (BytesType::format == byte_encode::base58_bytes &&
171 Format == byte_encode::raw_bytes),
173 std::string s = encode_base58(
180 template <
typename BytesType>
181 auto as()
const ->
typename std::enable_if<
182 std::is_same<typename BytesType::byte_t, ByteType>::value &&
183 (BytesType::format == byte_encode::hex_bytes &&
184 Format == byte_encode::raw_bytes),
190 ret.data(), ret.size());
194 template <
typename BytesType>
195 auto as()
const ->
typename std::enable_if<
196 std::is_same<typename BytesType::byte_t, ByteType>::value &&
197 (BytesType::format == byte_encode::base64_bytes &&
198 Format == byte_encode::raw_bytes),
200 std::string s = base64_encode(
207 template <
typename BytesType>
208 auto as()
const ->
typename std::enable_if<
209 std::is_same<typename BytesType::byte_t, ByteType>::value &&
210 (BytesType::format == byte_encode::raw_bytes &&
211 Format == byte_encode::hex_bytes),
215 auto v = internal::convert_hex_to_bytes(
219 throw std::invalid_argument(
"invalid hex string");
224 template <
typename BytesType>
225 auto as()
const ->
typename std::enable_if<
226 std::is_same<typename BytesType::byte_t, ByteType>::value &&
227 (BytesType::format == byte_encode::raw_bytes &&
228 Format == byte_encode::base58_bytes),
230 std::vector<unsigned char> v;
231 auto r = decode_base58(
236 throw std::invalid_argument(
"Invalid base58 string");
241 template <
typename BytesType>
242 auto as()
const ->
typename std::enable_if<
243 std::is_same<typename BytesType::byte_t, ByteType>::value &&
244 (BytesType::format == byte_encode::raw_bytes &&
245 Format == byte_encode::base64_bytes),
247 std::string s = base64_decode(
259 std::unique_ptr<ByteType[]>(
new ByteType[v.size()]);
281 return !operator==(v);