]> git.sesse.net Git - casparcg/blob - common/concurrency/com_context.h
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / common / concurrency / com_context.h
1 #pragma once\r
2 \r
3 #include "executor.h"\r
4 \r
5 #define NOMINMAX\r
6 #define WIN32_LEAN_AND_MEAN\r
7 \r
8 #include <Windows.h>\r
9 \r
10 #include <boost/noncopyable.hpp>\r
11 \r
12 #include <functional>\r
13 \r
14 namespace caspar {\r
15 \r
16 template<typename T>\r
17 class com_context : public executor\r
18 {\r
19         std::unique_ptr<T> instance_;\r
20 public:\r
21         com_context(const std::wstring& name) : executor(name)\r
22         {\r
23                 executor::begin_invoke([]\r
24                 {\r
25                         ::CoInitialize(nullptr);\r
26                 });\r
27         }\r
28 \r
29         ~com_context()\r
30         {\r
31                 executor::invoke([&]\r
32                 {\r
33                         instance_.reset(nullptr);\r
34                         ::CoUninitialize();\r
35                 });\r
36         }\r
37         \r
38         void reset(const std::function<T*()>& factory = nullptr)\r
39         {\r
40                 executor::invoke([&]\r
41                 {\r
42                         instance_.reset();\r
43                         if(factory)\r
44                                 instance_.reset(factory());\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 }