1
2//
3// This source file is part of appleseed.
4// Visit http://appleseedhq.net/ for additional information and resources.
5//
6// This software is released under the MIT license.
7//
8// Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9// Copyright (c) 2014-2017 Francois Beaune, The appleseedhq Organization
10//
11// Permission is hereby granted, free of charge, to any person obtaining a copy
12// of this software and associated documentation files (the "Software"), to deal
13// in the Software without restriction, including without limitation the rights
14// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15// copies of the Software, and to permit persons to whom the Software is
16// furnished to do so, subject to the following conditions:
17//
18// The above copyright notice and this permission notice shall be included in
19// all copies or substantial portions of the Software.
20//
21// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27// THE SOFTWARE.
28//
29
30#ifndef APPLESEED_FOUNDATION_CORE_CONCEPTS_IUNKNOWN_H
31#define APPLESEED_FOUNDATION_CORE_CONCEPTS_IUNKNOWN_H
32
33// appleseed.foundation headers.
34#include "foundation/core/concepts/noncopyable.h"
35
36// appleseed.main headers.
37#include "main/dllsymbol.h"
38
39namespace foundation
40{
41
42//
43// A COM-like IUnknown interface.
44//
45// At the moment, only the Release method is implemented, and it behaves
46// differently than the COM IUnknown::Release in that it simply deletes
47// the instance, whereas the COM one decrements the reference count by 1.
48// The other two methods, IUnknown::AddRef and IUnknown::QueryInterface,
49// are not yet supported.
50//
51
52class APPLESEED_DLLSYMBOL IUnknown
53 : public NonCopyable
54{
55 public:
56 // Delete this instance.
57 // Use this method to delete an instance which was created by a
58 // factory. This ensures that an instance is created and deleted
59 // using the same memory subsystem, for example if the factory
60 // resides inside a DLL. Do not use this method to delete an
61 // instance which was created using the new operator. In this case,
62 // simply use the delete operator.
63 virtual void release() = 0;
64
65 protected:
66 // Declare the destructor as protected to prevent the user from
67 // calling delete on an IUnknown pointer, but not on a pointer
68 // type derived from IUnknown.
69 // For convenience, also declare the destructor as virtual to
70 // make it safe to call delete on a derived type without having
71 // to add virtual destructors to all derived types.
72 virtual ~IUnknown() {}
73};
74
75} // namespace foundation
76
77#endif // !APPLESEED_FOUNDATION_CORE_CONCEPTS_IUNKNOWN_H
78