FireBreath  1.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Pages
variant_conversions.h
1 /**********************************************************\
2  Original Author: Richard Bateman
3 
4  Created: Dec 30, 2010
5  License: Dual license model; choose one of two:
6  New BSD License
7  http://www.opensource.org/licenses/bsd-license.php
8  - or -
9  GNU Lesser General Public License, version 2.1
10  http://www.gnu.org/licenses/lgpl-2.1.html
11 
12  Copyright 2009 Richard Bateman, Firebreath development team
13 \**********************************************************/
14 
15 #include <boost/shared_ptr.hpp>
16 
17 namespace FB {
18  class variant;
19  class JSAPI;
20  class JSObject;
21  namespace variant_detail {
22  namespace conversion {
23  template <class T>
24  struct type_spec
25  {};
26 
27  template <class T>
28  typename boost::enable_if<
29  boost::mpl::and_<
30  boost::is_base_of<FB::JSAPI, T>,
31  boost::mpl::not_<boost::is_base_of<FB::JSObject, T> > >
32  ,variant>::type
33  make_variant(const boost::shared_ptr<T>& ptr);
34 
35  template <class T>
36  typename boost::enable_if<boost::is_base_of<FB::JSObject, T>,variant>::type
37  make_variant(const boost::shared_ptr<T>& ptr);
38 
39  template<class Cont>
40  typename boost::enable_if<
41  boost::mpl::and_<
42  FB::meta::is_non_assoc_container<Cont>,
43  boost::mpl::not_<
44  boost::mpl::or_<
45  boost::mpl::or_<
46  boost::is_same<std::vector<variant>, Cont>,
47  boost::is_same<std::map<std::string, variant>, Cont>
48  >,
49  boost::mpl::or_<
50  boost::is_same<std::wstring, Cont>,
51  boost::is_same<std::string, Cont>
52  >
53  >
54  >
55  >
56  ,variant>::type
57  make_variant(const Cont& var);
58 
59  template<class Dict>
60  typename boost::enable_if<
61  boost::mpl::and_<
62  FB::meta::is_pair_assoc_container<Dict>,
63  boost::mpl::not_<
64  boost::is_same<std::map<std::string, variant>, Dict>
65  >
66  >
67  ,variant>::type
68  make_variant(const Dict& var);
69 
70  template<class T>
71  typename boost::enable_if<boost::is_base_of<FB::JSAPI, T>, boost::shared_ptr<T> >::type
72  convert_variant(const variant& var, variant_detail::conversion::type_spec< boost::shared_ptr<T> >);
73 
74  template<class Cont>
75  typename FB::meta::enable_for_non_assoc_containers<Cont, const Cont>::type
76  convert_variant(const variant& var, type_spec<Cont>);
77 
78  template<class Dict>
79  typename FB::meta::enable_for_pair_assoc_containers<Dict, const Dict>::type
80  convert_variant(const variant& var, type_spec<Dict>);
81  }
82  }
83 }
84