From 57ed5d979fa8b18b0b4a319b68b18456dcc5de57 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Tue, 17 Sep 2019 17:29:50 -0700 Subject: [PATCH] Added basic layout of raii::binary --- include/raii/binary.hpp | 116 ++++++++++++++++++++++++++++++++++++++++ src/raii/binary.cpp | 19 +++++++ 2 files changed, 135 insertions(+) create mode 100644 include/raii/binary.hpp create mode 100644 src/raii/binary.cpp diff --git a/include/raii/binary.hpp b/include/raii/binary.hpp new file mode 100644 index 0000000..278bbb2 --- /dev/null +++ b/include/raii/binary.hpp @@ -0,0 +1,116 @@ +#ifndef RAII_BINARY_HPP +#define RAII_BINARY_HPP + +#include //size_t +#include //move +#include //memcpy +#include + +namespace raii{ + + namespace detail{ + + template + struct default_binary_allocator{ + static void free(void* data){ + ::operator delete(data); + } + static void* allocate(size_t size){ + return ::operator new(size, std::align_val_t(Alignment)); + } + static void* copy(const void* c, size_t size){ + char* tmp = reinterpret_cast(allocate(size)); + memcpy(tmp, c, size); + return tmp; + } + }; + + } + + class binary_base + { + protected: + char* m_data = nullptr; + size_t m_size = 0; + size_t m_cap = 0; + public: + constexpr binary_base(void) = default; + constexpr binary_base(char* data, size_t size): + m_data(data), m_size(size){} + protected: + template + binary_base(const binary_base& b): + m_data(Allocator::copy(b.m_data, b.m_cap)), + m_size(b.m_size), + m_cap(b.m_cap){} + binary_base(binary_base&&); + public: + ~binary_base(void) = default; + + char* release(void); + + constexpr size_t size(void)const{return m_size;} + constexpr size_t capacity(void)const{return m_cap;} + constexpr char* get(void){return m_data;} + constexpr const char* get(void)const{return m_data;} + constexpr operator bool(void)const{return m_data;} + + char& operator[](size_t i); + const char& operator[](size_t i)const; + + }; + template> + class binary : public binary_base + { + public: + constexpr binary(void) = default; + binary(char* data, size_t size): + binary_base(Allocator::copy(data, size), size){} + binary(size_t size): + binary_base(Allocator::allocate(size), size){} + binary(const binary& b): + binary_base(b) + { + m_data = Allocator::copy(b.m_data, b.m_cap); + } + binary(binary&& b): + binary_base(std::move(b)){} + ~binary(void){ + Allocator::free(m_data); + } + binary& operator=(const binary& b){ + binary tmp(b); + return (*this = std::move(tmp)); + } + binary& operator=(binary&& b){ + m_size = b.m_size; + m_cap = b.m_cap; + std::swap(m_data, b.m_data); + return *this; + } + void reset(void){ + Allocator::free(m_data); + m_data = nullptr; + m_cap = m_size = 0; + } + void reset(char* val, size_t cap, size_t size = 0){ + Allocator::free(m_data); + m_data = val; + m_cap = cap; + m_size = size; + } + bool resize(size_t newsize){ + if(newsize < m_cap) + return false; + binary tmp(newsize); + if(!tmp) + return false; + memcpy(tmp.m_data, m_data, m_size); + *this = std::move(tmp); + return true; + } + }; + +} + +#endif diff --git a/src/raii/binary.cpp b/src/raii/binary.cpp new file mode 100644 index 0000000..c7c4dac --- /dev/null +++ b/src/raii/binary.cpp @@ -0,0 +1,19 @@ +#include "raii/binary.hpp" + +namespace raii{ + + binary_base::binary_base(binary_base&& b): + m_data(std::exchange(b.m_data, nullptr)), + m_size(b.m_size), + m_cap(b.m_cap){} + + char* binary_base::release(void){ + return std::exchange(m_data, nullptr); + } + char& binary_base::operator[](size_t i){ + return m_data[i]; + } + const char& binary_base::operator[](size_t i)const{ + return m_data[i]; + } +}