Skip to content
Snippets Groups Projects
Commit 9436b32d authored by Raphael Grimm's avatar Raphael Grimm
Browse files

Add simox::meta::hana_member_name

parent ab4e8295
No related branches found
No related tags found
No related merge requests found
......@@ -178,6 +178,7 @@ SET(INCLUDES
meta/EnumNames.hpp
meta/type_name.h
meta/boost_hana/has_hana_accessor.h
meta/boost_hana/hana_member_name.h
meta/type_traits/is_any_of.h
meta/type_traits/is_std_array.h
meta/type_traits/are_arithmetic.h
......
......@@ -2,4 +2,5 @@
// This file is generated!
#include "boost_hana/hana_member_name.h"
#include "boost_hana/has_hana_accessor.h"
#pragma once
#include <boost/hana/core/to.hpp>
#include "has_hana_accessor.h"
namespace simox::meta::detail::_hana_member_name
{
template<class CL, class MT, MT CL::* ptr>
struct helper
{
static_assert(has_hana_accessor_v<CL>, "The given type was not adapted by hana");
using accessor = boost::hana::accessors_impl<CL>;
using tuple = decltype(accessor::apply());
using member_ptr = boost::hana::struct_detail::member_ptr<MT CL::*, ptr>;
template<class...Ts>
struct search
{
static_assert(sizeof...(Ts), "Member not found");
};
template<class Name, class Ptr, class...Ts>
struct search<boost::hana::pair<Name, Ptr>, Ts...>
{
static constexpr const char* get()
{
if constexpr(std::is_same_v<Ptr, member_ptr>)
{
return boost::hana::to<char const*>(Name{});
}
else
{
return search<Ts...>::get();
}
}
};
template<class T>
struct search_init
{
static_assert(!std::is_same_v<T, T>, "The given type was not adapted by hana");
};
template<class...Ts>
struct search_init<boost::hana::tuple<Ts...>> : search<Ts...>
{};
static constexpr const char* name = search_init<tuple>::get();
};
}
namespace simox::meta
{
template<class CL, class MT, MT CL::* ptr>
static constexpr const char* hana_member_name =
detail::_hana_member_name::helper<CL, MT, ptr>::name;
}
/**
* @package VirtualRobot
* @author Rainer Kartmann
* @copyright 2018 Rainer Kartmann
*/
#define BOOST_TEST_MODULE SimoxUtility/meta/BoostHana
#include <string>
#include <iostream>
#include <boost/test/included/unit_test.hpp>
#include <boost/hana/adapt_struct.hpp>
#include <SimoxUtility/meta/boost_hana.h>
namespace hana = boost::hana;
namespace ns
{
struct Person
{
std::string name;
int age;
};
}
BOOST_HANA_ADAPT_STRUCT(ns::Person, name, age);
BOOST_AUTO_TEST_CASE(test_hana_member_name)
{
const auto name = simox::meta::hana_member_name<ns::Person, std::string, &ns::Person::name>;
const auto age = simox::meta::hana_member_name<ns::Person, int, &ns::Person::age>;
BOOST_CHECK_EQUAL("name", name);
BOOST_CHECK_EQUAL("age", age);
std::cout << "name -> " << name << '\n';
std::cout << "age -> " << age << '\n';
}
ADD_SU_TEST( EnumNames )
ADD_SU_TEST( BoostHana )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment