aboutsummaryrefslogtreecommitdiff
path: root/src/support/tuple
diff options
context:
space:
mode:
Diffstat (limited to 'src/support/tuple')
-rw-r--r--src/support/tuple/mapper.h62
-rw-r--r--src/support/tuple/xobject_value.cc18
-rw-r--r--src/support/tuple/xobject_value.h17
3 files changed, 97 insertions, 0 deletions
diff --git a/src/support/tuple/mapper.h b/src/support/tuple/mapper.h
new file mode 100644
index 0000000..c95365e
--- /dev/null
+++ b/src/support/tuple/mapper.h
@@ -0,0 +1,62 @@
+#ifndef INPUTXSLT_SRC_SUPPORT_TUPLE_MAPPER_H_
+#define INPUTXSLT_SRC_SUPPORT_TUPLE_MAPPER_H_
+
+#include <xalanc/XPath/XObject.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "common.h"
+#include "xobject_value.h"
+
+namespace InputXSLT {
+
+template <bool Condition>
+using enable_if = typename std::enable_if<Condition, std::size_t>::type;
+
+namespace Mapper {
+ template <
+ typename Target,
+ std::size_t Index = 0,
+ typename Current = std::tuple<>,
+ enable_if<Index == std::tuple_size<Target>::value> = 0
+ >
+ inline Target construct(
+ const xalan::XPathExecutionContext::XObjectArgVectorType&,
+ Current&& current
+ ) {
+ return current;
+ }
+
+ template <
+ typename Target,
+ std::size_t Index = 0,
+ typename Current = std::tuple<>,
+ enable_if<Index < std::tuple_size<Target>::value> = 0
+ >
+ inline Target construct(
+ const xalan::XPathExecutionContext::XObjectArgVectorType& source,
+ Current&& current = std::tuple<>()
+ ) {
+ return construct<
+ Target,
+ Index + 1
+ >(
+ source,
+ std::tuple_cat(
+ current,
+ std::make_tuple(
+ XObjectValue::get<
+ typename std::tuple_element<Index, Target>::type
+ >(
+ source[Index]
+ )
+ )
+ )
+ );
+ }
+};
+
+}
+
+#endif // INPUTXSLT_SRC_SUPPORT_TUPLE_MAPPER_H_
diff --git a/src/support/tuple/xobject_value.cc b/src/support/tuple/xobject_value.cc
new file mode 100644
index 0000000..3883436
--- /dev/null
+++ b/src/support/tuple/xobject_value.cc
@@ -0,0 +1,18 @@
+#include "xobject_value.h"
+
+#include <string>
+
+#include "support/xalan_string.h"
+
+namespace InputXSLT {
+
+namespace XObjectValue {
+
+template <>
+std::string get<std::string>(const xalan::XObjectPtr& ptr) {
+ return toString(ptr->str());
+}
+
+}
+
+}
diff --git a/src/support/tuple/xobject_value.h b/src/support/tuple/xobject_value.h
new file mode 100644
index 0000000..bb602a4
--- /dev/null
+++ b/src/support/tuple/xobject_value.h
@@ -0,0 +1,17 @@
+#ifndef INPUTXSLT_SRC_SUPPORT_TUPLE_XOBJECT_VALUE_H_
+#define INPUTXSLT_SRC_SUPPORT_TUPLE_XOBJECT_VALUE_H_
+
+#include <xalanc/XPath/XObject.hpp>
+
+#include "common.h"
+
+namespace InputXSLT {
+
+namespace XObjectValue {
+ template <typename Type>
+ Type get(const xalan::XObjectPtr&);
+}
+
+}
+
+#endif // INPUTXSLT_SRC_SUPPORT_TUPLE_XOBJECT_VALUE_H_