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)
|
target_link_options(rexy PRIVATE -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls)
|
||||||
endif()
|
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)
|
target_compile_options(rexy PRIVATE -Wall -Wextra -pedantic -std=c++17)
|
||||||
|
|
||||||
install(TARGETS rexy
|
install(TARGETS rexy
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
#include <new>
|
#include <new>
|
||||||
#include <rexy/detail/util.hpp> //max
|
#include <rexy/detail/util.hpp> //max
|
||||||
#include <rexy/detail/default_allocator.hpp>
|
#include <rexy/detail/default_allocator.hpp>
|
||||||
|
#include <rexy/steal.hpp>
|
||||||
|
|
||||||
#define STOP_STRICT_ALIAS_WARNING(x) (x)
|
#define STOP_STRICT_ALIAS_WARNING(x) (x)
|
||||||
|
|
||||||
@ -72,12 +73,16 @@ namespace rexy{
|
|||||||
using allocator_type = Allocator;
|
using allocator_type = Allocator;
|
||||||
public:
|
public:
|
||||||
constexpr binary_data(void) = default;
|
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_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_data(const char* data, size_t size):
|
||||||
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), 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_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_data(const char* data, size_t cap, size_t size):
|
||||||
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), cap, size){}
|
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), cap, size){}
|
||||||
binary_data(size_t 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 <utility> //forward
|
||||||
#include <cstdlib> //size_t
|
#include <cstdlib> //size_t
|
||||||
|
|
||||||
|
#include <rexy/steal.hpp>
|
||||||
|
|
||||||
namespace rexy{
|
namespace rexy{
|
||||||
|
|
||||||
class string_expr{};
|
class string_expr{};
|
||||||
@ -77,10 +79,13 @@ namespace rexy{
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
string_intermediary(void) = default;
|
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(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(const char* data);
|
||||||
|
string_intermediary(rexy::steal<char*>);
|
||||||
string_intermediary(size_t len);
|
string_intermediary(size_t len);
|
||||||
string_intermediary(size_t len, size_t cap);
|
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_intermediary<Allocator>::string_intermediary(char* data, size_t len):
|
||||||
string_base(data, len){}
|
string_base(data, len){}
|
||||||
template<class Allocator>
|
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_intermediary<Allocator>::string_intermediary(char* data, size_t len, size_t cap):
|
||||||
string_base(data, len, cap){}
|
string_base(data, len, cap){}
|
||||||
template<class Allocator>
|
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_intermediary<Allocator>::string_intermediary(const char* data, size_t len):
|
||||||
string_base(reinterpret_cast<char*>(len ? Allocator::copy(data, len+1) : nullptr), len)
|
string_base(reinterpret_cast<char*>(len ? Allocator::copy(data, len+1) : nullptr), len)
|
||||||
{
|
{
|
||||||
@ -48,6 +54,13 @@ namespace rexy{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
template<class Allocator>
|
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_intermediary<Allocator>::string_intermediary(size_t len):
|
||||||
string_base(reinterpret_cast<char*>(len ? Allocator::allocate(len+1) : nullptr), 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){
|
rexy::string filerd::read(size_t bytes){
|
||||||
char* tmp = reinterpret_cast<char*>(rexy::string::allocator_type::allocate(bytes));
|
char* tmp = reinterpret_cast<char*>(rexy::string::allocator_type::allocate(bytes));
|
||||||
size_t written = read(tmp, 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 filerd::readln(size_t max){
|
||||||
rexy::string ret;
|
rexy::string ret;
|
||||||
@ -99,7 +99,7 @@ namespace rexy{
|
|||||||
rexy::binary filerd::read_bin(size_t bytes){
|
rexy::binary filerd::read_bin(size_t bytes){
|
||||||
char* tmp = reinterpret_cast<char*>(rexy::binary::allocator_type::allocate(bytes));
|
char* tmp = reinterpret_cast<char*>(rexy::binary::allocator_type::allocate(bytes));
|
||||||
size_t written = read(tmp, 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){
|
size_t filerd::write(const char* c, size_t bytes){
|
||||||
return fwrite(c, 1, bytes, m_fp);
|
return fwrite(c, 1, bytes, m_fp);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user