]> git.sesse.net Git - casparcg/blob - common/param.h
made all producers-factories able to handle non-uppercased params
[casparcg] / common / param.h
1 #pragma once
2
3 #include "except.h"
4
5 #include <boost/lexical_cast.hpp>
6 #include <boost/algorithm/string.hpp>
7
8 #include <type_traits>
9 #include <string>
10
11 namespace caspar {
12
13 class param_comparer {
14                 const std::wstring& lhs;
15         public:
16                 explicit param_comparer(const std::wstring& p) : lhs(p) {}
17                 bool operator()(const std::wstring& rhs) { return boost::iequals(lhs, rhs); }
18         };
19
20 template<typename C>
21 bool contains_param(const std::wstring& name, C&& params)
22 {
23         return std::find_if(params.begin(), params.end(), param_comparer(name)) != params.end();
24 }
25
26 template<typename T, typename C>
27 typename std::enable_if<!std::is_convertible<T, std::wstring>::value, typename std::decay<T>::type>::type get_param(const std::wstring& name, C&& params, T fail_value = T())
28 {       
29         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
30         //auto it = std::find(std::begin(params), std::end(params), name);
31         if(it == params.end())  
32                 return fail_value;
33         
34         try
35         {
36                 if(++it == params.end())
37                         throw std::out_of_range("");
38
39                 return boost::lexical_cast<std::decay<T>::type>(*it);
40         }
41         catch(...)
42         {               
43                 CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));
44         }
45 }
46
47 template<typename C>
48 std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")
49 {       
50         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
51         //auto it = std::find(std::begin(params), std::end(params), name);
52         if(it == params.end())  
53                 return fail_value;
54         
55         try
56         {
57                 if(++it == params.end())
58                         throw std::out_of_range("");
59
60                 return *it;     
61         }
62         catch(...)
63         {               
64                 CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));
65         }
66 }
67
68 }