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);