]> git.sesse.net Git - casparcg/blobdiff - common/param.h
[ffmpeg] Ported 2.0.7 ffmpeg producer to 2.1.0 while still keeping the usage of the...
[casparcg] / common / param.h
index 94ec4923ccaea9f8dfaf68bbcc0758f4b5a327b4..2a0f63224b81277d30f8ad909c8744fd76e42265 100644 (file)
@@ -1,36 +1,93 @@
-#pragma once\r
-\r
-#include <boost/lexical_cast.hpp>\r
-\r
-#include <type_traits>\r
-#include <string>\r
-\r
-namespace caspar {\r
-               \r
-template<typename T, typename C>\r
-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
-{      \r
-       auto it = std::find(std::begin(params), std::end(params), name);\r
-       if(it == params.end() || ++it == params.end())  \r
-               return fail_value;\r
-       \r
-       T value = fail_value;\r
-       try\r
-       {\r
-               value = boost::lexical_cast<std::decay<T>::type>(*it);\r
-       }\r
-       catch(boost::bad_lexical_cast&){}\r
-\r
-       return value;\r
-}\r
-\r
-template<typename C>\r
-std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")\r
-{      \r
-       auto it = std::find(std::begin(params), std::end(params), name);\r
-       if(it == params.end() || ++it == params.end())  \r
-               return fail_value;\r
-       return *it;\r
-}\r
-\r
-}
\ No newline at end of file
+#pragma once
+
+#include "except.h"
+
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <type_traits>
+#include <string>
+
+namespace caspar {
+
+class param_comparer
+{
+       const std::wstring& lhs;
+public:
+       explicit param_comparer(const std::wstring& p) : lhs(p) {}
+       bool operator()(const std::wstring& rhs) { return boost::iequals(lhs, rhs); }
+};
+
+template<typename C>
+bool contains_param(const std::wstring& name, C&& params)
+{
+       return std::find_if(params.begin(), params.end(), param_comparer(name)) != params.end();
+}
+
+template<typename C>
+void replace_placeholders(const std::wstring& placeholder, const std::wstring& replacement, C&& params)
+{
+       for (auto& param : params)
+               boost::ireplace_all(param, placeholder, replacement);
+}
+
+static std::vector<std::wstring> protocol_split(const std::wstring& s)
+{
+       std::vector<std::wstring> result;
+       size_t pos;
+
+       if ((pos = s.find(L"://")) != std::wstring::npos)
+       {
+               result.push_back(s.substr(0, pos));
+               result.push_back(s.substr(pos + 3));
+       }
+       else
+       {
+               result.push_back(L"");
+               result.push_back(s);
+       }
+
+       return result;
+}
+
+template<typename T, typename C>
+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())
+{      
+       auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
+       if(it == params.end())  
+               return fail_value;
+       
+       try
+       {
+               if(++it == params.end())
+                       throw std::out_of_range("");
+
+               return boost::lexical_cast<typename std::decay<T>::type>(*it);
+       }
+       catch(...)
+       {               
+               CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
+       }
+}
+
+template<typename C>
+std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")
+{      
+       auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
+       if(it == params.end())  
+               return fail_value;
+       
+       try
+       {
+               if(++it == params.end())
+                       throw std::out_of_range("");
+
+               return *it;     
+       }
+       catch(...)
+       {               
+               CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
+       }
+}
+
+}