]> git.sesse.net Git - casparcg/blob - common/param.h
2.1.0: -Fixed ffmpeg input crash. -Log throwing call-stack.
[casparcg] / common / param.h
1 #pragma once\r
2 \r
3 #include "except.h"\r
4 \r
5 #include <boost/lexical_cast.hpp>\r
6 \r
7 #include <type_traits>\r
8 #include <string>\r
9 \r
10 namespace caspar {\r
11                 \r
12 template<typename T, typename C>\r
13 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())\r
14 {       \r
15         auto it = std::find(std::begin(params), std::end(params), name);\r
16         if(it == params.end())  \r
17                 return fail_value;\r
18         \r
19         try\r
20         {\r
21                 if(++it == params.end())\r
22                         throw std::out_of_range("");\r
23 \r
24                 return boost::lexical_cast<std::decay<T>::type>(*it);\r
25         }\r
26         catch(...)\r
27         {               \r
28                 CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));\r
29         }\r
30 }\r
31 \r
32 template<typename C>\r
33 std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")\r
34 {       \r
35         auto it = std::find(std::begin(params), std::end(params), name);\r
36         if(it == params.end())  \r
37                 return fail_value;\r
38         \r
39         try\r
40         {\r
41                 if(++it == params.end())\r
42                         throw std::out_of_range("");\r
43 \r
44                 return *it;     \r
45         }\r
46         catch(...)\r
47         {               \r
48                 CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));\r
49         }\r
50 }\r
51 \r
52 }