Add rexy::steal to disambiguate constructors of strings and binarys

This commit is contained in:
rexy712 2020-04-09 12:59:24 -07:00
parent 7351e3be10
commit afd2f02032
6 changed files with 72 additions and 7 deletions

View File

@ -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

View File

@ -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
View 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

View File

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

View File

@ -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)
{ {

View File

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