/** This file is a part of rexy's general purpose library Copyright (C) 2020 rexy712 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ #ifndef REXY_BINARY_STRING_CONV_HPP #define REXY_BINARY_STRING_CONV_HPP #include "rexy/string.hpp" #include "rexy/binary.hpp" #include //memcpy namespace rexy{ template = 0> auto binary_to_string(const binary_data& b){ Str s(b.size()+1); memcpy(s.get(), b.get(), b.size()); s[b.size()] = 0; return s; } template = 0, std::enable_if_t,typename Str::allocator_type>::value,int> = 0> auto binary_to_string(binary_data&& b){ Str s; s.reset(b.get(), b.size()); b.release(); return s; } template = 0> auto string_to_binary(const string_base& s){ Bin b(s.length()+1); b.append(s.get(), s.length()+1); return b; } template = 0, std::enable_if_t,typename Bin::allocator_type>::value,int> = 0> auto string_to_binary(string_intermediary&& s){ Bin b; b.reset(s.get(), s.length()+1); s.release(); return b; } template = 0, detail::enable_if_concrete_string = 0> decltype(auto) operator+=(L& l, R&& r){ l.append(r.get(), r.length()+1); return l; } template = 0, detail::enable_if_string = 0, std::enable_if_t::value,int> = 0> decltype(auto) operator+=(L& l, R&& r){ rexy::string concrete = r; return (l = concrete); } template = 0, detail::enable_if_binary = 0> decltype(auto) operator+=(L& l, R&& r){ l.resize(l.length(), r.size() + 1); memcpy(l.get()+l.length()+1, r.get(), r.size()); return l; } } //namespace rexy #endif