You.i Engine
YiSharedArray.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SHARED_ARRAY_H_
3 #define _YI_SHARED_ARRAY_H_
4 
5 #include "smartptr/YiSharedPtr.h"
6 
12 template<typename YI_ARRAY_TYPE>
14 
137 template<typename YI_ARRAY_TYPE>
139 {
140  template<typename YI_OTHER_PTR_TYPE> friend class CYIWeakArray;
141  template<typename YI_OTHER_PTR_TYPE> friend class CYISharedArray;
142 
143 public:
144  typedef CYISharedPtr<YI_ARRAY_TYPE> CYISharedArray<YI_ARRAY_TYPE>::* YI_UNSPECIFIED_BOOL_TYPE;
145 
149  inline CYISharedArray()
150  {
151  }
152 
157  CYISharedArray(YI_ARRAY_TYPE array[]);
158 
163  template<typename YI_FUNCTION_OBJECT>
164  inline CYISharedArray(YI_ARRAY_TYPE array[], YI_FUNCTION_OBJECT functor) :
165  m_pPtr(array, functor)
166  {
167  }
168 
174  m_pPtr(rOther.m_pPtr)
175  {
176  }
177 
183  template<typename YI_OTHER_ARRAY_TYPE>
185  m_pPtr(rOther.m_pPtr)
186  {
187  }
188 
194  m_pPtr(rOther.m_pPtr)
195  {
196  }
197 
203  template<typename YI_OTHER_ARRAY_TYPE>
205  m_pPtr(rOther.m_pPtr)
206  {
207  }
208 
212  inline void Reset()
213  {
214  m_pPtr.Reset();
215  }
216 
220  inline YI_ARRAY_TYPE &operator*() const
221  {
222  return *m_pPtr;
223  }
224 
228  inline bool operator!() const
229  {
230  return !m_pPtr;
231  }
232 
254  inline operator YI_UNSPECIFIED_BOOL_TYPE() const
255  {
256  return m_pPtr.IsNull() ? nullptr : &CYISharedArray<YI_ARRAY_TYPE>::m_pPtr;
257  }
258 
268  {
269  if (m_pPtr != rOther.m_pPtr)
270  {
271  m_pPtr = rOther.m_pPtr;
272  }
273  return *this;
274  }
275 
284  template<typename YI_OTHER_PTR_TYPE>
286  {
287  if (m_pPtr != rOther.m_pPtr)
288  {
289  m_pPtr = rOther.m_pPtr;
290  }
291  return *this;
292  }
293 
303  {
304  if (m_pPtr != rOther.m_pPtr)
305  {
306  m_pPtr = rOther.m_Ptr;
307  }
308  return *this;
309  }
310 
319  template<typename YI_OTHER_PTR_TYPE>
321  {
322  if (m_pPtr != rOther.m_pPtr)
323  {
324  m_pPtr = rOther.m_Ptr;
325  }
326  return *this;
327  }
328 
332  inline YI_ARRAY_TYPE *Get() const
333  {
334  return m_pPtr.Get();
335  }
336 
340  inline bool IsNull() const
341  {
342  return m_pPtr.IsNull();
343  }
344 
348  inline bool IsUnique() const
349  {
350  return m_pPtr.IsUnique();
351  }
352 
356  inline uint32_t GetUseCount() const
357  {
358  return m_pPtr.GetUseCount();
359  }
360 
365  {
366  m_pPtr.Swap(rPtr.m_pPtr);
367  }
368 
374  static inline const CYIRuntimeTypeInfo &GetClassTypeInfo()
375  {
376  YI_ENSURE_TYPE_HAS_RTTI_DATA(YI_ARRAY_TYPE);
377  return YI_ARRAY_TYPE::GetClassTypeInfo();
378  }
379 
405  inline YI_ARRAY_TYPE &operator[](int32_t nIndex)
406  {
407  YI_ASSERT(m_pPtr, "CYISharedArray", "Attempted to read into a null shared array.");
408  return m_pPtr.Get()[nIndex];
409  }
410 
436  inline const YI_ARRAY_TYPE &operator[](int32_t nIndex) const
437  {
438  YI_ASSERT(m_pPtr, "CYISharedArray", "Attempted to read into a null shared array.");
439  return m_pPtr.Get()[nIndex];
440  }
441 
460  {
461  return CYIWeakArray<YI_ARRAY_TYPE>(*this);
462  }
463 
464 private:
465  template<typename YI_RAW_PTR>
466  static inline void YiDefaultArrayDeleteFunctor(YI_RAW_PTR *pPtr)
467  {
468  delete[] pPtr;
469  };
470 
472 };
473 
475 
476 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
478 {
479  return rLhs.Get() == rRhs.Get();
480 }
481 
482 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
484 {
485  return rLhs.Get() != rRhs.Get();
486 }
487 
488 template<typename YI_L_ARRAY_TYPE, typename YI_R_PTR_TYPE>
490 {
491  return rLhs.Get() == rRhs.Get();
492 }
493 
494 template<typename YI_L_ARRAY_TYPE, typename YI_R_PTR_TYPE>
496 {
497  return rLhs.Get() != rRhs.Get();
498 }
499 
500 template<typename YI_L_PTR_TYPE, typename YI_R_ARRAY_TYPE>
502 {
503  return rLhs.Get() == rRhs.Get();
504 }
505 
506 template<typename YI_L_PTR_TYPE, typename YI_R_ARRAY_TYPE>
508 {
509  return rLhs.Get() != rRhs.Get();
510 }
511 
512 template<typename YI_L_ARRAY_TYPE, typename YI_R_PTR_TYPE>
514 {
515  return rLhs.Get() == rRhs.Get();
516 }
517 
518 template<typename YI_L_ARRAY_TYPE, typename YI_R_PTR_TYPE>
520 {
521  return rLhs.Get() != rRhs.Get();
522 }
523 
524 template<typename YI_L_PTR_TYPE, typename YI_R_ARRAY_TYPE>
526 {
527  return rLhs.Get() == rRhs.Get();
528 }
529 
530 template<typename YI_L_PTR_TYPE, typename YI_R_ARRAY_TYPE>
532 {
533  return rLhs.Get() != rRhs.Get();
534 }
535 
536 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
537 inline bool operator==(const CYISharedArray<YI_L_ARRAY_TYPE> &rLhs, const YI_R_ARRAY_TYPE pRhs[])
538 {
539  return rLhs.Get() == pRhs;
540 }
541 
542 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
543 inline bool operator!=(const CYISharedArray<YI_L_ARRAY_TYPE> &rLhs, const YI_R_ARRAY_TYPE pRhs[])
544 {
545  return rLhs.Get() != pRhs;
546 }
547 
548 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
549 inline bool operator==(const YI_L_ARRAY_TYPE pLhs[], const CYISharedArray<YI_R_ARRAY_TYPE> &rRhs)
550 {
551  return pLhs == rRhs.Get();
552 }
553 
554 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE>
555 inline bool operator!=(const YI_L_ARRAY_TYPE pLhs[], const CYISharedArray<YI_R_ARRAY_TYPE> &rRhs)
556 {
557  return pLhs != rRhs.Get();
558 }
559 
562 template<typename YI_ARRAY_TYPE>
563 inline CYISharedArray<YI_ARRAY_TYPE>::CYISharedArray(YI_ARRAY_TYPE array[]) :
564 m_pPtr(array, YiDefaultArrayDeleteFunctor)
565 {
566 }
567 
568 #endif /* _YI_SHARED_ARRAY_H_ */
void Reset()
Definition: YiSharedArray.h:212
CYISharedArray(const CYIWeakArray< YI_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:193
void Swap(CYISharedArray< YI_ARRAY_TYPE > &rPtr)
Definition: YiSharedArray.h:364
CYISharedArray()
Definition: YiSharedArray.h:149
bool IsNull() const
Definition: YiSharedArray.h:340
bool IsNull() const
bool operator!=(const CYISharedArray< YI_L_ARRAY_TYPE > &rLhs, const CYISharedArray< YI_R_ARRAY_TYPE > &rRhs)
Definition: YiSharedArray.h:483
The CYISharedArray is a smart pointer that takes shared ownership of a dynamically allocated array of...
Definition: YiSharedArray.h:138
The CYIWeakPtr is a smart pointer that does not take any ownership of a dynamically allocated object...
Definition: YiSharedPtr.h:20
CYISharedArray< YI_ARRAY_TYPE > & operator=(const CYIWeakArray< YI_OTHER_PTR_TYPE > &rOther)
Definition: YiSharedArray.h:320
CYISharedArray(YI_ARRAY_TYPE array[], YI_FUNCTION_OBJECT functor)
Definition: YiSharedArray.h:164
static const CYIRuntimeTypeInfo & GetClassTypeInfo()
Definition: YiSharedArray.h:374
uint32_t GetUseCount() const
The CYIWeakArray is a smart pointer that does not take ownership of a dynamically allocated array of ...
Definition: YiSharedArray.h:13
uint32_t GetUseCount() const
Definition: YiSharedArray.h:356
void Swap(CYISharedPtr< YI_PTR_TYPE > &rPtr)
const YI_ARRAY_TYPE & operator[](int32_t nIndex) const
Definition: YiSharedArray.h:436
bool IsUnique() const
YI_PTR_TYPE * Get() const
YI_PTR_TYPE * Get() const
CYISharedArray(const CYIWeakArray< YI_OTHER_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:204
The abstract runtime representation of a C++ type.
Definition: YiRtti.h:48
CYISharedArray< YI_ARRAY_TYPE > & operator=(const CYISharedArray< YI_OTHER_PTR_TYPE > &rOther)
Definition: YiSharedArray.h:285
CYISharedArray(const CYISharedArray< YI_OTHER_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:184
bool operator==(const CYISharedArray< YI_L_ARRAY_TYPE > &rLhs, const CYISharedArray< YI_R_ARRAY_TYPE > &rRhs)
Definition: YiSharedArray.h:477
CYISharedArray(const CYISharedArray< YI_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:173
#define YI_ASSERT(condition, tag, msg,...)
Platform-independent assertion macro.
Definition: YiError.h:37
bool IsUnique() const
Definition: YiSharedArray.h:348
CYIWeakArray< YI_ARRAY_TYPE > ToWeakArray() const
Definition: YiSharedArray.h:459
YI_ARRAY_TYPE * Get() const
Definition: YiSharedArray.h:332
CYISharedArray< YI_ARRAY_TYPE > & operator=(const CYIWeakArray< YI_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:302
bool operator!() const
Definition: YiSharedArray.h:228
YI_ARRAY_TYPE & operator[](int32_t nIndex)
Definition: YiSharedArray.h:405
YI_ARRAY_TYPE & operator*() const
Definition: YiSharedArray.h:220
CYISharedArray< YI_ARRAY_TYPE > & operator=(const CYISharedArray< YI_ARRAY_TYPE > &rOther)
Definition: YiSharedArray.h:267