// // immer: immutable data structures for C++ // Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente // // This software is distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt // #pragma once #include #include namespace scm { namespace detail { template struct definer { using this_t = definer; using next_t = definer; std::string group_name_ = {}; definer() = default; definer(definer&&) = default; template > definer(definer) {} template next_t define(std::string name, Fn fn) && { define_impl(name, fn); return { std::move(*this) }; } template next_t maker(Fn fn) && { define_impl("make", fn); return { std::move(*this) }; } }; template struct group_definer { using this_t = group_definer; using next_t = group_definer; std::string group_name_ = {}; group_definer(std::string name) : group_name_{std::move(name)} {} group_definer(group_definer&&) = default; template > group_definer(group_definer) {} template next_t define(std::string name, Fn fn) && { define_impl(group_name_ + "-" + name, fn); return { std::move(*this) }; } }; } // namespace detail template detail::definer group() { return {}; } template detail::group_definer group(std::string name) { return { std::move(name) }; } } // namespace scm