/*
 * Copyright (C) 2020-2021 Aloysius Indrayanto
 *
 * This file is part of the eCxx library, see LICENSE file for the license details.
 */


#ifndef ECXX_CTL_UNINSTANTIABLE_UNCOPYABLE_H
#define ECXX_CTL_UNINSTANTIABLE_UNCOPYABLE_H


#include <eCxx/CTL/Types.h>


namespace eCxx {


//
// A base class to make an uninstantiable and uncopyable classes
//
class Uninstantiable {
    public:
        Uninstantiable() = delete;
        ~Uninstantiable() = delete;

        Uninstantiable(const Uninstantiable& ) = delete;
        Uninstantiable(      Uninstantiable&&) = delete;

        Uninstantiable& operator=(const Uninstantiable& ) = delete;
        Uninstantiable& operator=(      Uninstantiable&&) = delete;
};


//
// A base class to make an uncopyable classes
//
class Uncopyable {
    public:
        inline Uncopyable() = default;
        inline ~Uncopyable() = default;

        Uncopyable(const Uncopyable& ) = delete;
        Uncopyable(      Uncopyable&&) = delete;

        Uncopyable& operator=(const Uncopyable& ) = delete;
        Uncopyable& operator=(      Uncopyable&&) = delete;
};


} // namespace eCxx


#endif
