| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- //
- // message.h
- // cli
- //
- // Created by Sam Jaffe on 10/10/20.
- // Copyright © 2020 Sam Jaffe. All rights reserved.
- //
- #pragma once
- #include <iostream>
- #include <memory>
- #include <tuple>
- namespace cli { namespace detail {
- template <typename T, size_t ...Is>
- void print(std::ostream &os, T const & tup, std::index_sequence<Is...>) {
- os << std::boolalpha;
- using swallow = int[];
- (void)swallow{0, ((void)(os << std::get<Is>(tup)), 0)...};
- os << std::noboolalpha;
- }
- template <typename T> struct up_string { using type = std::remove_reference_t<T>; };
- template <size_t N> struct up_string<char const(&)[N]> {
- using type = std::string;
- };
- template <typename T> using up_string_t = typename up_string<T>::type;
- }}
- namespace cli {
- struct message {
- virtual ~message() = default;
- virtual void print(std::ostream &) const = 0;
- };
- template <typename ...T>
- struct message_impl : public message {
- std::tuple<T...> tuple;
- message_impl(std::tuple<T...> &&tuple) : tuple(std::move(tuple)) {}
- void print(std::ostream &os) const override {
- detail::print(os, tuple, std::make_index_sequence<sizeof...(T)>{});
- }
- };
- template <typename ...Args>
- auto make_message(Args &&...args) {
- using detail::up_string_t;
- using message_t = message_impl<up_string_t<Args>...>;
- auto tuple = std::make_tuple(std::forward<up_string_t<Args>>(args)...);
- return std::make_shared<message_t>(std::move(tuple));
- }
- }
|