openshot-audio  0.1.6
juce_ReferenceCountedObject.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the juce_core module of the JUCE library.
5  Copyright (c) 2015 - ROLI Ltd.
6 
7  Permission to use, copy, modify, and/or distribute this software for any purpose with
8  or without fee is hereby granted, provided that the above copyright notice and this
9  permission notice appear in all copies.
10 
11  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
12  TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
13  NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
15  IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16  CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 
18  ------------------------------------------------------------------------------
19 
20  NOTE! This permissive ISC license applies ONLY to files within the juce_core module!
21  All other JUCE modules are covered by a dual GPL/commercial license, so if you are
22  using any other modules, be sure to check that you also comply with their license.
23 
24  For more details, visit www.juce.com
25 
26  ==============================================================================
27 */
28 
29 #ifndef JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED
30 #define JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED
31 
32 
33 //==============================================================================
66 {
67 public:
68  //==============================================================================
75  {
76  ++refCount;
77  }
78 
83  {
84  jassert (getReferenceCount() > 0);
85 
86  if (--refCount == 0)
87  delete this;
88  }
89 
95  {
96  jassert (getReferenceCount() > 0);
97  return --refCount == 0;
98  }
99 
101  int getReferenceCount() const noexcept { return refCount.get(); }
102 
103 
104 protected:
105  //==============================================================================
108 
111  {
112  // it's dangerous to delete an object that's still referenced by something else!
113  jassert (getReferenceCount() == 0);
114  }
115 
120  {
121  refCount = 0;
122  }
123 
124 private:
125  //==============================================================================
126  Atomic <int> refCount;
127 
130 };
131 
132 
133 //==============================================================================
145 {
146 public:
147  //==============================================================================
154  {
155  ++refCount;
156  }
157 
162  {
163  jassert (getReferenceCount() > 0);
164 
165  if (--refCount == 0)
166  delete this;
167  }
168 
174  {
175  jassert (getReferenceCount() > 0);
176  return --refCount == 0;
177  }
178 
180  int getReferenceCount() const noexcept { return refCount; }
181 
182 
183 protected:
184  //==============================================================================
187 
190  {
191  // it's dangerous to delete an object that's still referenced by something else!
192  jassert (getReferenceCount() == 0);
193  }
194 
195 private:
196  //==============================================================================
197  int refCount;
198 
201 };
202 
203 
204 //==============================================================================
226 template <class ReferenceCountedObjectClass>
228 {
229 public:
231  typedef ReferenceCountedObjectClass ReferencedType;
232 
233  //==============================================================================
236  : referencedObject (nullptr)
237  {
238  }
239 
243  ReferenceCountedObjectPtr (ReferencedType* refCountedObject) noexcept
244  : referencedObject (refCountedObject)
245  {
246  incIfNotNull (refCountedObject);
247  }
248 
253  : referencedObject (other.referencedObject)
254  {
255  incIfNotNull (referencedObject);
256  }
257 
261  template <class Convertible>
263  : referencedObject (static_cast <ReferencedType*> (other.get()))
264  {
265  incIfNotNull (referencedObject);
266  }
267 
273  {
274  return operator= (other.referencedObject);
275  }
276 
281  template <class Convertible>
283  {
284  return operator= (static_cast<ReferencedType*> (other.get()));
285  }
286 
292  ReferenceCountedObjectPtr& operator= (ReferencedType* const newObject)
293  {
294  if (referencedObject != newObject)
295  {
296  incIfNotNull (newObject);
297  ReferencedType* const oldObject = referencedObject;
298  referencedObject = newObject;
299  decIfNotNull (oldObject);
300  }
301 
302  return *this;
303  }
304 
305  #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
306 
308  : referencedObject (other.referencedObject)
309  {
310  other.referencedObject = nullptr;
311  }
312 
315  {
316  std::swap (referencedObject, other.referencedObject);
317  return *this;
318  }
319  #endif
320 
326  {
327  decIfNotNull (referencedObject);
328  }
329 
330  //==============================================================================
334  operator ReferencedType*() const noexcept { return referencedObject; }
335 
339  ReferencedType* get() const noexcept { return referencedObject; }
340 
344  ReferencedType* getObject() const noexcept { return referencedObject; }
345 
346  // the -> operator is called on the referenced object
347  ReferencedType* operator->() const noexcept
348  {
349  jassert (referencedObject != nullptr); // null pointer method call!
350  return referencedObject;
351  }
352 
353 private:
354  //==============================================================================
355  ReferencedType* referencedObject;
356 
357  static void incIfNotNull (ReferencedType* o) noexcept
358  {
359  if (o != nullptr)
360  o->incReferenceCount();
361  }
362 
363  static void decIfNotNull (ReferencedType* o) noexcept
364  {
365  if (o != nullptr && o->decReferenceCountWithoutDeleting())
367  }
368 };
369 
370 
371 //==============================================================================
373 template <class ReferenceCountedObjectClass>
374 bool operator== (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, ReferenceCountedObjectClass* const object2) noexcept
375 {
376  return object1.get() == object2;
377 }
378 
380 template <class ReferenceCountedObjectClass>
382 {
383  return object1.get() == object2.get();
384 }
385 
387 template <class ReferenceCountedObjectClass>
388 bool operator== (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
389 {
390  return object1 == object2.get();
391 }
392 
394 template <class ReferenceCountedObjectClass>
395 bool operator!= (const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object1, const ReferenceCountedObjectClass* object2) noexcept
396 {
397  return object1.get() != object2;
398 }
399 
401 template <class ReferenceCountedObjectClass>
403 {
404  return object1.get() != object2.get();
405 }
406 
408 template <class ReferenceCountedObjectClass>
409 bool operator!= (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr<ReferenceCountedObjectClass>& object2) noexcept
410 {
411  return object1 != object2.get();
412 }
413 
414 
415 #endif // JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED
~ReferenceCountedObjectPtr()
Definition: juce_ReferenceCountedObject.h:325
void decReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:161
#define noexcept
Definition: juce_CompilerSupport.h:141
Definition: juce_Atomic.h:41
void incReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:74
ReferenceCountedObjectClass ReferencedType
Definition: juce_ReferenceCountedObject.h:231
ReferencedType * getObject() const noexcept
Definition: juce_ReferenceCountedObject.h:344
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr &other) noexcept
Definition: juce_ReferenceCountedObject.h:252
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr< Convertible > &other) noexcept
Definition: juce_ReferenceCountedObject.h:262
ReferenceCountedObjectPtr() noexcept
Definition: juce_ReferenceCountedObject.h:235
virtual ~ReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:110
#define JUCE_API
Definition: juce_StandardHeader.h:139
#define const
ReferencedType * operator->() const noexcept
Definition: juce_ReferenceCountedObject.h:347
bool decReferenceCountWithoutDeleting() noexcept
Definition: juce_ReferenceCountedObject.h:173
Definition: juce_ReferenceCountedObject.h:65
void resetReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:119
void incReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:153
ReferencedType * get() const noexcept
Definition: juce_ReferenceCountedObject.h:339
ReferenceCountedObjectPtr & operator=(const ReferenceCountedObjectPtr &other)
Definition: juce_ReferenceCountedObject.h:272
Definition: juce_ReferenceCountedObject.h:227
virtual ~SingleThreadedReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:189
void decReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:82
Definition: juce_ContainerDeletePolicy.h:44
SingleThreadedReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:186
#define jassert(a)
Definition: juce_PlatformDefs.h:146
bool decReferenceCountWithoutDeleting() noexcept
Definition: juce_ReferenceCountedObject.h:94
#define JUCE_DECLARE_NON_COPYABLE(className)
Definition: juce_PlatformDefs.h:191
ReferenceCountedObjectPtr(ReferencedType *refCountedObject) noexcept
Definition: juce_ReferenceCountedObject.h:243
ReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:107
bool operator!=(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, const ReferenceCountedObjectClass *object2) noexcept
Definition: juce_ReferenceCountedObject.h:395
bool operator==(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, ReferenceCountedObjectClass *const object2) noexcept
Definition: juce_ReferenceCountedObject.h:374
int getReferenceCount() const noexcept
Definition: juce_ReferenceCountedObject.h:101
int getReferenceCount() const noexcept
Definition: juce_ReferenceCountedObject.h:180
Definition: juce_ReferenceCountedObject.h:144