12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // 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 <boost/hana.hpp>
- #include <functional>
- #include <iostream>
- #include <string>
- #include <type_traits>
- #include <utility>
- 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 <typename Xs>
- std::string join(Xs&& xs, std::string sep) {
- return hana::fold(hana::intersperse(std::forward<Xs>(xs), sep), "", std::plus<>{});
- }
- std::string quote(std::string s) { return "\"" + s + "\""; }
- template <typename T>
- 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 <typename T>
- std::enable_if_t<hana::Struct<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<char const*>(name)) + " : " + to_json(member);
- });
- return "{" + join(std::move(json), ", ") + "}";
- }
- // 3. Define how to print Sequences
- template <typename Xs>
- std::enable_if_t<hana::Sequence<Xs>::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;
- }
|