summaryrefslogtreecommitdiffstats
path: root/ComLightLib/server/ObjectRoot.hpp
diff options
context:
space:
mode:
authorKonstantin <const@const.me>2023-01-16 14:52:43 +0100
committerKonstantin <const@const.me>2023-01-16 14:52:43 +0100
commit8c4603c73675958efc960fbd4bb599a2909d106a (patch)
tree714dc6fc9a1672d5fd7f89676b97e10959662abc /ComLightLib/server/ObjectRoot.hpp
parent990a8d0dbaefc996244097397259e92758b15cce (diff)
Source codes
Diffstat (limited to 'ComLightLib/server/ObjectRoot.hpp')
-rw-r--r--ComLightLib/server/ObjectRoot.hpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/ComLightLib/server/ObjectRoot.hpp b/ComLightLib/server/ObjectRoot.hpp
new file mode 100644
index 0000000..1cc8f4d
--- /dev/null
+++ b/ComLightLib/server/ObjectRoot.hpp
@@ -0,0 +1,51 @@
+#pragma once
+#include "RefCounter.hpp"
+#include "../comLightCommon.h"
+#include "../utils/typeTraits.hpp"
+
+namespace ComLight
+{
+ // Base class of objects, implements reference counting, also a few lifetime methods.
+ // The template argument is the interface you want clients to get when they ask for IID_IUnknown. By convention, that pointer defines object's identity.
+ template<class I>
+ class ObjectRoot : public RefCounter, public I
+ {
+ protected:
+
+ inline HRESULT internalFinalConstruct()
+ {
+ return S_FALSE;
+ }
+
+ inline HRESULT FinalConstruct()
+ {
+ return S_FALSE;
+ }
+
+ inline void FinalRelease() { }
+
+ IUnknown* getUnknown()
+ {
+ static_assert( details::pointersAssignable<IUnknown, I>(), "The interface doesn't derive from IUnknown" );
+ return static_cast<I*>( this );
+ }
+
+ bool queryExtraInterfaces( REFIID riid, void **ppvObject ) const
+ {
+ return false;
+ }
+
+ // Implement query interface with 2 entries, IUnknown and I.
+ bool implQueryInterface( REFIID riid, void** ppvObject )
+ {
+ if( riid == I::iid() || riid == IUnknown::iid() )
+ {
+ I* const result = this;
+ result->AddRef();
+ *ppvObject = result;
+ return true;
+ }
+ return false;
+ }
+ };
+} \ No newline at end of file