Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
ObjectsVariant.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <alib/variant>
10#include <core/xmlApi.hpp>
11
12namespace core {
13
14template < typename T >
16 throw exception::CommonException ( "Can't parse variant type" );
17}
18
19template < typename T, typename R, typename ... Ts >
21 if ( core::xmlApi < R >::first ( input ) ) return T ( core::xmlApi < R >::parse ( input ) );
22
23 return parseVariantHelper < T, Ts ... > ( input );
24}
25
26template < typename T, typename R, typename ... Ts >
28 if ( core::xmlApi < R >::first ( input ) ) return true;
29
30 return firstVariantHelper < T, Ts ... > ( input );
31}
32
33template < typename T >
35 throw exception::CommonException ( "Can't compose variant type" );
36}
37
38template < typename T, typename R, typename ... Ts >
40 if ( container.template is < R > ( ) )
41 return core::xmlApi < R >::compose ( out, container.template get < R > ( ) );
42
43 composeVariantHelper < T, Ts ... > ( out, container );
44}
45
46template < typename ... Ts >
47struct xmlApi < ext::variant < Ts ... > > {
49 static bool first ( const ext::deque < sax::Token >::const_iterator & input );
50 static std::string xmlTagName ( );
51 static void compose ( ext::deque < sax::Token > & output, const ext::variant < Ts ... > & input );
52};
53
54template < typename ... Ts >
55ext::variant < Ts ... > xmlApi < ext::variant < Ts ... > >::parse ( ext::deque < sax::Token >::iterator & input ) {
56 return parseVariantHelper < ext::variant < Ts ... >, Ts ... > ( input );
57}
58
59template < typename ... Ts >
60bool xmlApi < ext::variant < Ts ... > >::first ( const ext::deque < sax::Token >::const_iterator & ) {
61 return false;
62}
63
64template < typename ... Ts >
65std::string xmlApi < ext::variant < Ts ... > >::xmlTagName ( ) {
66 throw exception::CommonException ( "Variant does not have xmlTagName." );
67}
68
69template < typename ... Ts >
70void xmlApi < ext::variant < Ts ... > >::compose ( ext::deque < sax::Token > & output, const ext::variant < Ts ... > & input ) {
71 composeVariantHelper < ext::variant < Ts ... >, Ts ... > ( output, input );
72}
73
74} /* namespace core */
75
Basic exception from which all other exceptions are derived.
Definition: CommonException.h:21
Class extending the deque class from the standard library. Original reason is to allow printing of th...
Definition: deque.hpp:44
Implementation of the variant class allowing to store any type of those listed in the template parame...
Definition: variant.hpp:98
Definition: ContainerFromStringLexer.cpp:8
Definition: normalize.hpp:10
void composeVariantHelper(ext::deque< sax::Token > &, const T &)
Definition: ObjectsVariant.h:34
T parseVariantHelper(ext::deque< sax::Token >::iterator &)
Definition: ObjectsVariant.h:15
T firstVariantHelper(ext::deque< sax::Token >::iterator &input)
Definition: ObjectsVariant.h:27
Definition: sigHandler.cpp:20
static ext::variant< Ts ... > parse(ext::deque< sax::Token >::iterator &input)
static bool first(const ext::deque< sax::Token >::const_iterator &input)
static void compose(ext::deque< sax::Token > &output, const ext::variant< Ts ... > &input)
Definition: xmlApi.hpp:27