// Copyright Louis Dionne 2013-2017 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include namespace hana = boost::hana; using namespace hana::literals; using namespace std::literals; ////////////////////////////////////////////////////////////////////////////// // Welcome to Hana! // // You can play around and press 'Run' at the bottom of this file to compile // and run this code. // // To get you started, here's a small JSON generator written with Hana // (this is explained in the tutorial if you're interested): ////////////////////////////////////////////////////////////////////////////// // 1. Define some utilities template std::string join(Xs&& xs, std::string sep) { return hana::fold(hana::intersperse(std::forward(xs), sep), "", std::plus<>{}); } std::string quote(std::string s) { return "\"" + s + "\""; } template auto to_json(T const& x) -> decltype(std::to_string(x)) { return std::to_string(x); } std::string to_json(char c) { return quote({c}); } std::string to_json(std::string s) { return quote(s); } // 2. Define how to print user-defined types template std::enable_if_t::value, std::string> to_json(T const& x) { auto json = hana::transform(hana::keys(x), [&](auto name) { auto const& member = hana::at_key(x, name); return quote(hana::to(name)) + " : " + to_json(member); }); return "{" + join(std::move(json), ", ") + "}"; } // 3. Define how to print Sequences template std::enable_if_t::value, std::string> to_json(Xs const& xs) { auto json = hana::transform(xs, [](auto const& x) { return to_json(x); }); return "[" + join(std::move(json), ", ") + "]"; } // 4. Create your own types and make them compatible with Hana. // This can be done intrusively or non-intrusively. struct Car { BOOST_HANA_DEFINE_STRUCT(Car, (std::string, brand), (std::string, model) ); }; int main() { // 5. Generate beautiful JSON without hassle. Enjoy! auto cars = hana::make_tuple( Car{"BMW", "Z3"}, Car{"Audi", "A4"}, Car{"Ferrari", "F40"}, Car{"Lamborghini", "Diablo"} // ... ); std::cout << to_json(cars) << std::endl; }