summaryrefslogtreecommitdiff
path: root/friendly_fusion.hpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2014-04-18 18:30:52 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2014-04-18 18:30:52 +0200
commitd834eba65c2c65c1540d13c9c39ced51bd87cf83 (patch)
tree68c0533b668545cbfb0b0d556ac7ebf9bf8d3e97 /friendly_fusion.hpp
parent0969e7a24c0ae2a0cc9c5bd4be0d18c29bfe7f30 (diff)
downloadgeneric-gui-d834eba65c2c65c1540d13c9c39ced51bd87cf83.tar.gz
generic-gui-d834eba65c2c65c1540d13c9c39ced51bd87cf83.tar.bz2
generic-gui-d834eba65c2c65c1540d13c9c39ced51bd87cf83.zip
First working prototype
Diffstat (limited to 'friendly_fusion.hpp')
-rw-r--r--friendly_fusion.hpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/friendly_fusion.hpp b/friendly_fusion.hpp
new file mode 100644
index 0000000..b014bd8
--- /dev/null
+++ b/friendly_fusion.hpp
@@ -0,0 +1,129 @@
+#pragma once
+
+#include <boost/fusion/include/size.hpp>
+#include <boost/fusion/include/begin.hpp>
+#include <boost/fusion/include/deref.hpp>
+#include <boost/fusion/include/value_of.hpp>
+#include <boost/fusion/include/distance.hpp>
+#include <boost/fusion/include/advance.hpp>
+#include <boost/fusion/include/is_view.hpp>
+#include <boost/fusion/include/is_sequence.hpp>
+#include <boost/fusion/include/is_iterator.hpp>
+#include <boost/fusion/include/struct.hpp>
+#include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
+
+#include <boost/mpl/or.hpp>
+
+namespace friendly_fusion {
+
+namespace traits {
+
+template <typename T, bool NoCheck = true>
+struct is_sequence : public boost::fusion::traits::is_sequence<T>
+{
+ static_assert(NoCheck || boost::fusion::traits::is_sequence<T>::value, "Template parameter: T, is not a fusion adapted struct.");
+};
+
+template <typename T, bool NoCheck = true>
+struct is_fusion_iterator : public boost::fusion::is_fusion_iterator<T>
+{
+ static_assert(NoCheck || boost::fusion::is_fusion_iterator<T>::value, "Template parameter: T. Is not a fusion iterator.");
+};
+
+template <typename T, bool NoCheck = true>
+struct is_view : public boost::fusion::traits::is_view<T> {
+ static_assert(NoCheck || boost::fusion::traits::is_view<T>::value, "Template parameter: T, is not a fusion view");
+};
+
+template <typename T, bool NoCheck = true>
+struct is_sequence_or_view : public boost::mpl::or_<typename boost::fusion::traits::is_sequence<T>, typename boost::fusion::traits::is_view<T>> {
+ static_assert(NoCheck || (boost::fusion::traits::is_sequence<T>::value || boost::fusion::traits::is_view<T>::value), "Template parameter: T, is not a fusion sequence or a view");
+};
+
+}
+
+template <typename T>
+typename std::enable_if<traits::is_fusion_iterator<T, false>::value, typename boost::fusion::result_of::deref<T>::type>::type
+deref(T const& x)
+{
+ return boost::fusion::deref(x);
+}
+
+template <int N, typename T>
+typename std::enable_if<traits::is_fusion_iterator<T, false>::value, typename boost::fusion::result_of::advance_c<T, N>::type>::type
+advance_c(T const& x)
+{
+ return boost::fusion::advance_c<N>(x);
+}
+
+template <typename T>
+typename std::enable_if<traits::is_sequence_or_view<T, false>::value, typename boost::fusion::result_of::begin<T>::type>::type const
+begin(T& x)
+{
+ return boost::fusion::begin(x);
+}
+
+template <typename T>
+typename std::enable_if<traits::is_sequence_or_view<T, false>::value, typename boost::fusion::result_of::begin<T const>::type>::type const
+begin(T const& x)
+{
+ return boost::fusion::begin(x);
+}
+
+template <typename T>
+typename std::enable_if<traits::is_sequence_or_view<T, false>::value, typename boost::fusion::result_of::end<T>::type>::type const
+end(T& x)
+{
+ return boost::fusion::end(x);
+}
+
+template <typename T>
+typename std::enable_if<traits::is_sequence_or_view<T, false>::value, typename boost::fusion::result_of::end<T const>::type>::type const
+end(T const& x)
+{
+ return boost::fusion::end(x);
+}
+
+namespace result_of {
+
+template <typename T>
+struct size : private traits::is_sequence_or_view<T, false>, public boost::fusion::result_of::size<T>
+{
+ using typename boost::fusion::result_of::size<T>::type;
+};
+
+template <typename T>
+struct begin : private traits::is_sequence_or_view<T, false>, public boost::fusion::result_of::begin<T>
+{
+ using typename boost::fusion::result_of::begin<T>::type;
+};
+
+template <typename T>
+struct end : private traits::is_sequence_or_view<T, false>, public boost::fusion::result_of::end<T>
+{
+ using typename boost::fusion::result_of::end<T>::type;
+};
+
+template <typename T, int N>
+struct advance_c : private traits::is_fusion_iterator<T, false>, public boost::fusion::result_of::advance_c<T, N>
+{
+ using typename boost::fusion::result_of::advance_c<T, N>::type;
+};
+
+template <typename T>
+struct deref : private traits::is_fusion_iterator<T, false>, public boost::fusion::result_of::deref<T>
+{
+ using typename boost::fusion::result_of::deref<T>::type;
+};
+
+}
+
+namespace extension {
+
+template<typename T, int index>
+struct struct_member_name : private traits::is_sequence<T, false>, public boost::fusion::extension::struct_member_name<T, index>
+{};
+
+}
+
+} \ No newline at end of file