openshot-audio  0.1.7
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 
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 
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
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
SingleThreadedReferenceCountedObject::getReferenceCount
int getReferenceCount() const noexcept
Definition: juce_ReferenceCountedObject.h:180
operator==
bool operator==(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, ReferenceCountedObjectClass *const object2) noexcept
Definition: juce_ReferenceCountedObject.h:374
ReferenceCountedObjectPtr::ReferencedType
ReferenceCountedObjectClass ReferencedType
Definition: juce_ReferenceCountedObject.h:231
ReferenceCountedObjectPtr::ReferenceCountedObjectPtr
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr< Convertible > &other) noexcept
Definition: juce_ReferenceCountedObject.h:262
ReferenceCountedObject::ReferenceCountedObject
ReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:107
ContainerDeletePolicy
Definition: juce_ContainerDeletePolicy.h:44
ReferenceCountedObjectPtr::ReferenceCountedObjectPtr
ReferenceCountedObjectPtr() noexcept
Definition: juce_ReferenceCountedObject.h:235
ReferenceCountedObject::getReferenceCount
int getReferenceCount() const noexcept
Definition: juce_ReferenceCountedObject.h:101
jassert
#define jassert(a)
Definition: juce_PlatformDefs.h:146
SingleThreadedReferenceCountedObject::decReferenceCount
void decReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:161
SingleThreadedReferenceCountedObject::decReferenceCountWithoutDeleting
bool decReferenceCountWithoutDeleting() noexcept
Definition: juce_ReferenceCountedObject.h:173
JUCE_API
#define JUCE_API
Definition: juce_StandardHeader.h:139
ReferenceCountedObjectPtr::ReferenceCountedObjectPtr
ReferenceCountedObjectPtr(ReferencedType *refCountedObject) noexcept
Definition: juce_ReferenceCountedObject.h:243
operator!=
bool operator!=(const ReferenceCountedObjectPtr< ReferenceCountedObjectClass > &object1, const ReferenceCountedObjectClass *object2) noexcept
Definition: juce_ReferenceCountedObject.h:395
ReferenceCountedObjectPtr::~ReferenceCountedObjectPtr
~ReferenceCountedObjectPtr()
Definition: juce_ReferenceCountedObject.h:325
noexcept
#define noexcept
Definition: juce_CompilerSupport.h:141
SingleThreadedReferenceCountedObject::~SingleThreadedReferenceCountedObject
virtual ~SingleThreadedReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:189
ReferenceCountedObject::decReferenceCountWithoutDeleting
bool decReferenceCountWithoutDeleting() noexcept
Definition: juce_ReferenceCountedObject.h:94
ReferenceCountedObjectPtr::getObject
ReferencedType * getObject() const noexcept
Definition: juce_ReferenceCountedObject.h:344
ReferenceCountedObject::incReferenceCount
void incReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:74
SingleThreadedReferenceCountedObject::incReferenceCount
void incReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:153
ReferenceCountedObject
Definition: juce_ReferenceCountedObject.h:65
ReferenceCountedObject::~ReferenceCountedObject
virtual ~ReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:110
ContainerDeletePolicy::destroy
static void destroy(ObjectType *object)
Definition: juce_ContainerDeletePolicy.h:46
ReferenceCountedObjectPtr::ReferenceCountedObjectPtr
ReferenceCountedObjectPtr(const ReferenceCountedObjectPtr &other) noexcept
Definition: juce_ReferenceCountedObject.h:252
ImagePixelData
Definition: juce_Image.h:432
ReferenceCountedObjectPtr
Definition: juce_ReferenceCountedObject.h:227
ReferenceCountedObject::resetReferenceCount
void resetReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:119
SingleThreadedReferenceCountedObject::SingleThreadedReferenceCountedObject
SingleThreadedReferenceCountedObject()
Definition: juce_ReferenceCountedObject.h:186
ReferenceCountedObjectPtr::operator=
ReferenceCountedObjectPtr & operator=(const ReferenceCountedObjectPtr &other)
Definition: juce_ReferenceCountedObject.h:272
JUCE_DECLARE_NON_COPYABLE
#define JUCE_DECLARE_NON_COPYABLE(className)
Definition: juce_PlatformDefs.h:191
SingleThreadedReferenceCountedObject
Definition: juce_ReferenceCountedObject.h:144
Atomic< int >
ReferenceCountedObjectPtr::operator->
ReferencedType * operator->() const noexcept
Definition: juce_ReferenceCountedObject.h:347
ReferenceCountedObject::decReferenceCount
void decReferenceCount() noexcept
Definition: juce_ReferenceCountedObject.h:82
ReferenceCountedObjectPtr::get
ReferencedType * get() const noexcept
Definition: juce_ReferenceCountedObject.h:339