/**
 * Reaver Library Licence
 *
 * Copyright © 2015 Michał "Griwes" Dominiak
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation is required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 *
 **/

#pragma once

namespace reaver
{
    namespace tpl { inline namespace _v1
    {
        namespace _detail
        {
            template<typename Original, typename Find, typename Replace>
            struct _replace
            {
                using type = Original;
            };

            template<typename Original, typename Replace>
            struct _replace<Original, Original, Replace>
            {
                using type = Replace;
            };

            template<template<typename...> typename Original, typename... Ts, typename Find, typename Replace>
            struct _replace<Original<Ts...>, Find, Replace>
            {
                using type = Original<typename _replace<Ts, Find, Replace>::type...>;
            };

            template<template<typename...> typename Original, typename... Ts, typename Replace>
            struct _replace<Original<Ts...>, Original<Ts...>, Replace>
            {
                using type = Replace;
            };
        }

        template<typename Original, typename Find, typename Replace>
        using replace = typename _detail::_replace<Original, Find, Replace>::type;
    }}
}

