// vi:set ft=cpp: -*- Mode: C++ -*- /* * Copyright (C) 2016 Kernkonzept GmbH. * Author(s): Philipp Eppelt * * This file is distributed under the terms of the GNU General Public * License, version 2. Please see the COPYING-GPL-2 file for details. * * As a special exception, you may use this file as part of a free software * library without restriction. Specifically, if other files instantiate * templates or use macros or inline functions from this file, or you compile * this file and link it with other files to produce an executable, this * file does not by itself cause the resulting executable to be covered by * the GNU General Public License. This exception does not however * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. */ #pragma once #include #include namespace std { namespace L4 { template struct _Make_unique { using __single = ::std::unique_ptr; }; template struct _Make_unique { using __array = ::std::unique_ptr; }; template struct _Make_unique { struct __invalid { }; }; /// Create an object of type `T` and return it inside a std::unique_ptr. template inline typename _Make_unique::__single make_unique(Args &&... args) { return ::std::unique_ptr(new T(::std::forward(args)...)); } /// Allocate an array of type `T` and return it inside a std::unique_ptr. template inline typename _Make_unique::__array make_unique(std::size_t size) { return ::std::unique_ptr(new typename std::remove_extent::type[size]()); } /// Disable std::make_unqiue for arrays of known bound. template inline typename _Make_unique::__invalid make_unique(Args &&...) = delete; }} // namespace L4, namespace std