Material Definition Language API nvidia_logo_transpbg.gif Up
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
interface_implement.h
Go to the documentation of this file.
1 /***************************************************************************************************
2  * Copyright 2020 NVIDIA Corporation. All rights reserved.
3  **************************************************************************************************/
6 
7 #ifndef MI_BASE_INTERFACE_IMPLEMENT_H
8 #define MI_BASE_INTERFACE_IMPLEMENT_H
9 
10 #include <mi/base/types.h>
11 #include <mi/base/uuid.h>
12 #include <mi/base/atom.h>
13 
14 namespace mi {
15 namespace base {
16 
21 // Forward declaration
22 class IInterface;
23 
39 template <class I>
40 class Interface_implement : public I
41 {
42 public:
47  : m_refcnt( initial)
48  {
49  }
50 
55  : m_refcnt( 1)
56  {
57  // avoid warning
58  (void) other;
59  }
60 
65  {
66  // Note: no call of operator= on m_refcount
67  // avoid warning
68  (void) other;
69  return *this;
70  }
71 
76  virtual Uint32 retain() const
77  {
78  return ++m_refcnt;
79  }
80 
86  virtual Uint32 release() const
87  {
88  Uint32 cnt = --m_refcnt;
89  if( !cnt)
90  delete this;
91  return cnt;
92  }
93 
104  virtual const IInterface* get_interface( const Uuid& interface_id) const
105  {
106  return I::get_interface_static( this, interface_id);
107  }
108 
119  virtual IInterface* get_interface( const Uuid& interface_id)
120  {
121  return I::get_interface_static( this, interface_id);
122  }
123 
124  using I::get_interface;
125 
127  Uuid get_iid() const
128  {
129  return typename I::IID();
130  }
131 
132 protected:
134  Atom32& refcount() const { return m_refcnt; }
135 
136 protected:
137  virtual ~Interface_implement() {}
138 
139 private:
140  mutable Atom32 m_refcnt;
141 };
142 
143 
161 template <class I1, class I2>
162 class Interface_implement_2 : public I1, public I2
163 {
164 public:
169  : m_refcnt( initial)
170  {
171  }
172 
177  : m_refcnt( 1)
178  {
179  // avoid warning
180  (void) other;
181  }
182 
187  {
188  // Note: no call of operator= on m_refcount
189  // avoid warning
190  (void) other;
191  return *this;
192  }
193 
198  virtual Uint32 retain() const
199  {
200  return ++m_refcnt;
201  }
202 
208  virtual Uint32 release() const
209  {
210  Uint32 cnt = --m_refcnt;
211  if( !cnt)
212  delete this;
213  return cnt;
214  }
215 
226  virtual const IInterface* get_interface( const Uuid& interface_id) const
227  {
228  const IInterface* iptr = I1::get_interface_static( static_cast<const I1*>(this),
229  interface_id);
230  if ( iptr == 0)
231  iptr = I2::get_interface_static( static_cast<const I2*>(this), interface_id);
232  return iptr;
233  }
234 
245  virtual IInterface* get_interface( const Uuid& interface_id)
246  {
247  IInterface* iptr = I1::get_interface_static(static_cast<I1*>(this),interface_id);
248  if ( iptr == 0)
249  iptr = I2::get_interface_static( static_cast<I2*>(this), interface_id);
250  return iptr;
251  }
252 
253  using I1::get_interface;
254 
256  Uuid get_iid() const
257  {
258  return typename I1::IID();
259  }
260 
261 protected:
262  virtual ~Interface_implement_2() {}
263 
264 private:
265  mutable Atom32 m_refcnt;
266 };
267 
268 
285 template <class I>
287 {
288 public:
293  virtual Uint32 retain() const
294  {
295  return 1;
296  }
297 
302  virtual Uint32 release() const
303  {
304  return 1;
305  }
306 
317  virtual const IInterface* get_interface( const Uuid& interface_id) const
318  {
319  return I::get_interface_static( this, interface_id);
320  }
321 
332  virtual IInterface* get_interface( const Uuid& interface_id)
333  {
334  return I::get_interface_static( this, interface_id);
335  }
336 
337  using I::get_interface;
338 
340  Uuid get_iid() const
341  {
342  return typename I::IID();
343  }
344 
345 protected:
346  virtual ~Interface_implement_singleton() {}
347 };
348 
349  // end group mi_base_iinterface
351 
352 } // namespace base
353 } // namespace mi
354 
355 #endif // MI_BASE_INTERFACE_IMPLEMENT_H