]> git.sesse.net Git - casparcg/blob - common/concurrency/com_context.h
2.0.0.2:
[casparcg] / common / concurrency / com_context.h
1 #pragma once\r
2 \r
3 #include "executor.h"\r
4 \r
5 #include <Windows.h>\r
6 \r
7 #include <boost/noncopyable.hpp>\r
8 \r
9 #include <functional>\r
10 \r
11 namespace caspar {\r
12 \r
13 template<typename T>\r
14 class com_context : public executor\r
15 {\r
16         std::unique_ptr<T> instance_;\r
17 public:\r
18         com_context(const std::wstring& name)\r
19                 : executor(name, true)\r
20         {\r
21                 executor::begin_invoke([]\r
22                 {\r
23                         ::CoInitialize(nullptr);\r
24                 });\r
25         }\r
26 \r
27         ~com_context()\r
28         {\r
29                 executor::clear();\r
30                 executor::invoke([&]\r
31                 {\r
32                         instance_.reset(nullptr);\r
33                         ::CoUninitialize();\r
34                 });\r
35         }\r
36         \r
37         void reset(const std::function<T*()>& factory)\r
38         {\r
39                 executor::invoke([&]\r
40                 {\r
41                         if(factory)\r
42                                 instance_.reset(factory());\r
43                         else\r
44                                 instance_.reset(nullptr);\r
45                 });\r
46         }\r
47 \r
48         T& operator*() const { return *instance_.get();}  // noexcept\r
49 \r
50         T* operator->() const { return instance_.get();}  // noexcept\r
51 \r
52         T* get() const { return instance_.get();}  // noexcept\r
53 \r
54         operator bool() const {return get() != nullptr;}\r
55 };\r
56 \r
57 }