Add rexy::steal to disambiguate constructors of strings and binarys
This commit is contained in:
parent
7351e3be10
commit
afd2f02032
@ -27,7 +27,7 @@ if(ENABLE_PROFILING)
|
||||
target_link_options(rexy PRIVATE -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls)
|
||||
endif()
|
||||
|
||||
set(LIBREXY_PUBLIC_HEADERS "include/rexy/binary.hpp" "include/rexy/string_base.hpp" "include/rexy/string.hpp" "include/rexy/filerd.hpp" "include/rexy/string_base.tpp" "include/rexy/detail/binary_string_conv.hpp" "include/rexy/detail/default_allocator.hpp" "include/rexy/detail/util.hpp")
|
||||
set(LIBREXY_PUBLIC_HEADERS "include/rexy/steal.hpp" "include/rexy/binary.hpp" "include/rexy/string_base.hpp" "include/rexy/string.hpp" "include/rexy/filerd.hpp" "include/rexy/string_base.tpp" "include/rexy/detail/binary_string_conv.hpp" "include/rexy/detail/default_allocator.hpp" "include/rexy/detail/util.hpp")
|
||||
target_compile_options(rexy PRIVATE -Wall -Wextra -pedantic -std=c++17)
|
||||
|
||||
install(TARGETS rexy
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
#include <new>
|
||||
#include <rexy/detail/util.hpp> //max
|
||||
#include <rexy/detail/default_allocator.hpp>
|
||||
#include <rexy/steal.hpp>
|
||||
|
||||
#define STOP_STRICT_ALIAS_WARNING(x) (x)
|
||||
|
||||
@ -72,12 +73,16 @@ namespace rexy{
|
||||
using allocator_type = Allocator;
|
||||
public:
|
||||
constexpr binary_data(void) = default;
|
||||
binary_data(char* data, size_t size):
|
||||
[[deprecated]] binary_data(char* data, size_t size):
|
||||
binary_base(data, size){}
|
||||
binary_data(rexy::steal<char*> data, size_t size):
|
||||
binary_base(data.value(), size){}
|
||||
binary_data(const char* data, size_t size):
|
||||
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), size){}
|
||||
binary_data(char* data, size_t cap, size_t size):
|
||||
[[deprecated]] binary_data(char* data, size_t cap, size_t size):
|
||||
binary_base(data, cap, size){}
|
||||
binary_data(rexy::steal<char*> data, size_t cap, size_t size):
|
||||
binary_base(data.value(), cap, size){}
|
||||
binary_data(const char* data, size_t cap, size_t size):
|
||||
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), cap, size){}
|
||||
binary_data(size_t size):
|
||||
|
||||
42
include/rexy/steal.hpp
Normal file
42
include/rexy/steal.hpp
Normal file
@ -0,0 +1,42 @@
|
||||
#ifndef REXY_STEAL_HPP
|
||||
#define REXY_STEAL_HPP
|
||||
|
||||
#include <utility> //forward
|
||||
|
||||
namespace rexy{
|
||||
|
||||
template<class T>
|
||||
class steal
|
||||
{
|
||||
private:
|
||||
T m_val;
|
||||
|
||||
public:
|
||||
template<class U>
|
||||
steal(U&& u):
|
||||
m_val(std::forward<U>(u)){}
|
||||
|
||||
steal(const steal&) = delete;
|
||||
steal(steal&&) = delete;
|
||||
steal& operator=(const steal&) = delete;
|
||||
steal& operator=(steal&&) = delete;
|
||||
|
||||
T&& value(void){
|
||||
return std::forward<T>(m_val);
|
||||
}
|
||||
const T& value(void)const{
|
||||
return m_val;
|
||||
}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
steal(const T&) -> steal<const T&>;
|
||||
template<class T>
|
||||
steal(T&&) -> steal<T&&>;
|
||||
template<class T>
|
||||
steal(T) -> steal<T>;
|
||||
template<class T>
|
||||
steal(T*) -> steal<T*>;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -23,6 +23,8 @@
|
||||
#include <utility> //forward
|
||||
#include <cstdlib> //size_t
|
||||
|
||||
#include <rexy/steal.hpp>
|
||||
|
||||
namespace rexy{
|
||||
|
||||
class string_expr{};
|
||||
@ -77,10 +79,13 @@ namespace rexy{
|
||||
|
||||
public:
|
||||
string_intermediary(void) = default;
|
||||
string_intermediary(char* data, size_t len);
|
||||
string_intermediary(rexy::steal<char*> data, size_t len);
|
||||
string_intermediary(rexy::steal<char*> data, size_t len, size_t cap);
|
||||
[[deprecated]] string_intermediary(char* data, size_t len);
|
||||
string_intermediary(const char* data, size_t len);
|
||||
string_intermediary(char* data, size_t len, size_t cap);
|
||||
[[deprecated]] string_intermediary(char* data, size_t len, size_t cap);
|
||||
string_intermediary(const char* data);
|
||||
string_intermediary(rexy::steal<char*>);
|
||||
string_intermediary(size_t len);
|
||||
string_intermediary(size_t len, size_t cap);
|
||||
|
||||
|
||||
@ -30,9 +30,15 @@ namespace rexy{
|
||||
string_intermediary<Allocator>::string_intermediary(char* data, size_t len):
|
||||
string_base(data, len){}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(rexy::steal<char*> data, size_t len):
|
||||
string_base(data.value(), len){}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(char* data, size_t len, size_t cap):
|
||||
string_base(data, len, cap){}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(rexy::steal<char*> data, size_t len, size_t cap):
|
||||
string_base(data.value(), len, cap){}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(const char* data, size_t len):
|
||||
string_base(reinterpret_cast<char*>(len ? Allocator::copy(data, len+1) : nullptr), len)
|
||||
{
|
||||
@ -48,6 +54,13 @@ namespace rexy{
|
||||
}
|
||||
}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(rexy::steal<char*> data):
|
||||
string_base(data.value() ? strlen(data.value()) : 0)
|
||||
{
|
||||
m_data = data.value();
|
||||
m_length = m_cap;
|
||||
}
|
||||
template<class Allocator>
|
||||
string_intermediary<Allocator>::string_intermediary(size_t len):
|
||||
string_base(reinterpret_cast<char*>(len ? Allocator::allocate(len+1) : nullptr), len)
|
||||
{
|
||||
|
||||
@ -83,7 +83,7 @@ namespace rexy{
|
||||
rexy::string filerd::read(size_t bytes){
|
||||
char* tmp = reinterpret_cast<char*>(rexy::string::allocator_type::allocate(bytes));
|
||||
size_t written = read(tmp, bytes);
|
||||
return rexy::string(tmp, written);
|
||||
return rexy::string(rexy::steal(tmp), written);
|
||||
}
|
||||
rexy::string filerd::readln(size_t max){
|
||||
rexy::string ret;
|
||||
@ -99,7 +99,7 @@ namespace rexy{
|
||||
rexy::binary filerd::read_bin(size_t bytes){
|
||||
char* tmp = reinterpret_cast<char*>(rexy::binary::allocator_type::allocate(bytes));
|
||||
size_t written = read(tmp, bytes);
|
||||
return rexy::binary(tmp, written, written);
|
||||
return rexy::binary(rexy::steal(tmp), written, written);
|
||||
}
|
||||
size_t filerd::write(const char* c, size_t bytes){
|
||||
return fwrite(c, 1, bytes, m_fp);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user