Skip to content

Commit

Permalink
Add a utility to inherit and conditionally disable copy/move operations
Browse files Browse the repository at this point in the history
  • Loading branch information
doom committed Mar 7, 2019
1 parent 630bc7c commit 2ac59d5
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ set(META_SOURCES

${CMAKE_CURRENT_SOURCE_DIR}/include/meta/detection/detection.hpp

${CMAKE_CURRENT_SOURCE_DIR}/include/meta/utils/allow_copy_move_operations.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/meta/utils/enum_bitwise_ops.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/meta/utils/integral_constants.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/meta/utils/meta_functions.hpp
Expand Down
178 changes: 178 additions & 0 deletions include/meta/utils/allow_copy_move_operations.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
/*
** Created by doom on 06/03/19.
*/

#ifndef META_UTILS_ALLOW_COPY_MOVE_OPERATIONS_HPP
#define META_UTILS_ALLOW_COPY_MOVE_OPERATIONS_HPP

namespace meta
{
template <typename T, bool>
class allow_move_construction_if : public T
{
public:
using T::T;

constexpr allow_move_construction_if() = default;

allow_move_construction_if(const allow_move_construction_if &) = default;

allow_move_construction_if(allow_move_construction_if &&) = default;

allow_move_construction_if &operator=(const allow_move_construction_if &) = default;

allow_move_construction_if &operator=(allow_move_construction_if &&) = default;
};

template <typename T>
class allow_move_construction_if<T, false> : public T
{
public:
using T::T;

constexpr allow_move_construction_if() = default;

allow_move_construction_if(const allow_move_construction_if &) = default;

allow_move_construction_if(allow_move_construction_if &&) = delete;

allow_move_construction_if &operator=(const allow_move_construction_if &) = default;

allow_move_construction_if &operator=(allow_move_construction_if &&) = default;
};

template <typename T, bool>
class allow_copy_construction_if : public T
{
public:
using T::T;

constexpr allow_copy_construction_if() = default;

allow_copy_construction_if(const allow_copy_construction_if &) = default;

allow_copy_construction_if(allow_copy_construction_if &&) = default;

allow_copy_construction_if &operator=(const allow_copy_construction_if &) = default;

allow_copy_construction_if &operator=(allow_copy_construction_if &&) = default;
};

template <typename T>
class allow_copy_construction_if<T, false> : public T
{
public:
using T::T;

constexpr allow_copy_construction_if() = default;

allow_copy_construction_if(const allow_copy_construction_if &) = delete;

allow_copy_construction_if(allow_copy_construction_if &&) = default;

allow_copy_construction_if &operator=(const allow_copy_construction_if &) = default;

allow_copy_construction_if &operator=(allow_copy_construction_if &&) = default;
};

template <typename T, bool>
class allow_move_assignment_if : public T
{
public:
using T::T;

constexpr allow_move_assignment_if() = default;

allow_move_assignment_if(const allow_move_assignment_if &) = default;

allow_move_assignment_if(allow_move_assignment_if &&) = default;

allow_move_assignment_if &operator=(const allow_move_assignment_if &) = default;

allow_move_assignment_if &operator=(allow_move_assignment_if &&) = default;
};

template <typename T>
class allow_move_assignment_if<T, false> : public T
{
public:
using T::T;

constexpr allow_move_assignment_if() = default;

allow_move_assignment_if(const allow_move_assignment_if &) = default;

allow_move_assignment_if(allow_move_assignment_if &&) = default;

allow_move_assignment_if &operator=(const allow_move_assignment_if &) = default;

allow_move_assignment_if &operator=(allow_move_assignment_if &&) = delete;
};

template <typename T, bool>
class allow_copy_assignment_if : public T
{
public:
using T::T;

constexpr allow_copy_assignment_if() = default;

allow_copy_assignment_if(const allow_copy_assignment_if &) = default;

allow_copy_assignment_if(allow_copy_assignment_if &&) = default;

allow_copy_assignment_if &operator=(const allow_copy_assignment_if &) = default;

allow_copy_assignment_if &operator=(allow_copy_assignment_if &&) = default;
};

template <typename T>
class allow_copy_assignment_if<T, false> : public T
{
public:
using T::T;

constexpr allow_copy_assignment_if() = default;

allow_copy_assignment_if(const allow_copy_assignment_if &) = default;

allow_copy_assignment_if(allow_copy_assignment_if &&) = default;

allow_copy_assignment_if &operator=(const allow_copy_assignment_if &) = delete;

allow_copy_assignment_if &operator=(allow_copy_assignment_if &&) = default;
};

template <
typename T,
bool AllowCopyConstruction,
bool AllowMoveConstruction,
bool AllowCopyAssignment,
bool AllowMoveAssignment
>
class allow_copy_and_move_if : public allow_copy_assignment_if<
allow_move_assignment_if<
allow_copy_construction_if<
allow_move_construction_if<
T, AllowMoveConstruction
>, AllowCopyConstruction
>, AllowMoveAssignment
>, AllowCopyAssignment
>
{
public:
using allow_copy_assignment_if<
allow_move_assignment_if<
allow_copy_construction_if<
allow_move_construction_if<
T, AllowMoveConstruction
>, AllowCopyConstruction
>, AllowMoveAssignment
>, AllowCopyAssignment>::allow_copy_assignment_if;

constexpr allow_copy_and_move_if() = default;
};
}


#endif /* !META_UTILS_ALLOW_COPY_MOVE_OPERATIONS_HPP */

0 comments on commit 2ac59d5

Please sign in to comment.