diff DEPENDENCIES/generic/include/boost/spirit/home/x3/support/subcontext.hpp @ 102:f46d142149f5

Whoops, finish that update
author Chris Cannam
date Mon, 07 Sep 2015 11:13:41 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/spirit/home/x3/support/subcontext.hpp	Mon Sep 07 11:13:41 2015 +0100
@@ -0,0 +1,89 @@
+/*=============================================================================
+    Copyright (c) 2001-2014 Joel de Guzman
+    Copyright (c) 2013 Agustín Bergé
+    http://spirit.sourceforge.net/
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM)
+#define BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM
+
+#if defined(_MSC_VER)
+#pragma once
+#endif
+
+#include <boost/fusion/support/pair.hpp>
+#include <boost/spirit/home/x3/support/context.hpp>
+#include <boost/spirit/home/x3/support/unused.hpp>
+
+namespace boost { namespace spirit { namespace x3
+{
+    template <typename... T>
+    struct subcontext;
+
+    template <>
+    struct subcontext<>
+    {
+        template <typename Context>
+        subcontext(Context const& /*context*/)
+        {}
+        
+        template <typename ID_, typename Unused = void>
+        struct get_result
+        {
+            typedef unused_type type;
+        };
+
+        template <typename ID_>
+        unused_type
+        get(ID_) const
+        {
+            return unused;
+        }
+    };
+
+    template <typename T>
+    struct subcontext<T>
+      : context<typename T::first_type, typename T::second_type>
+    {
+        typedef context<
+            typename T::first_type, typename T::second_type
+        > context_type;
+
+        template <typename Context>
+        subcontext(Context const& context)
+          : context_type(x3::get<typename T::first_type>(context))
+        {}
+
+        using context_type::get;
+    };
+
+    template <typename T, typename... Tail>
+    struct subcontext<T, Tail...>
+      : subcontext<Tail...>
+      , context<
+            typename T::first_type, typename T::second_type
+          , subcontext<Tail...>
+        >
+    {
+        typedef subcontext<Tail...> base_type;
+        typedef context<
+            typename T::first_type, typename T::second_type
+          , base_type
+        > context_type;
+
+        template <typename Context>
+        subcontext(Context const& context)
+          : base_type(context)
+          , context_type(
+                x3::get<typename T::first_type>(context)
+              , *static_cast<base_type*>(this))
+        {}
+
+        using context_type::get;
+    };
+
+}}}
+
+#endif