You.i Engine
YiScopedArray.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SCOPED_ARRAY_H_
3 #define _YI_SCOPED_ARRAY_H_
4 
5 #include "smartptr/YiScopedPtr.h"
6 
78 template<typename YI_ARRAY_TYPE, typename YI_DELETE_FUNCTOR = CYICheckedArrayDeleteFunctor<YI_ARRAY_TYPE> >
80 {
81 public:
87  inline explicit CYIScopedArray(YI_ARRAY_TYPE array[] = nullptr) :
88  m_pPtr(array, YI_DELETE_FUNCTOR())
89  {
90  }
91 
98  inline CYIScopedArray(YI_ARRAY_TYPE array[], const YI_DELETE_FUNCTOR &deleter) :
99  m_pPtr(array, deleter)
100  {
101  }
102 
108  inline CYIScopedArray(CYIScopedArray &&other) :
109  m_pPtr(std::move(other.m_pPtr))
110  {
111  }
112 
119  inline CYIScopedArray(YI_ARRAY_TYPE array[], YI_DELETE_FUNCTOR &&deleter) :
120  m_pPtr(array, std::move(deleter))
121  {
122  }
123 
129  template<typename YI_ARRAY_OTHER_TYPE, typename YI_OTHER_DELETER>
131  m_pPtr(std::move(other.m_pPtr))
132  {
133  }
134 
138  inline void operator=(YI_ARRAY_TYPE pPtr[])
139  {
140  if (pPtr != m_pPtr.Get())
141  {
142  m_pPtr = pPtr;
143  }
144  }
145 
150  {
151  m_pPtr = std::move(other.m_pPtr);
152  return *this;
153  }
154 
158  template<typename YI_PTR_OTHER_TYPE, typename YI_OTHER_DELETER>
160  {
161  m_pPtr = std::move(other.m_pPtr);
162  return *this;
163  }
164 
168  inline YI_ARRAY_TYPE &operator*() const
169  {
170  YI_ASSERT(m_pPtr, "CYIScopedArray", "Attempted to dereference a null scoped array.");
171  return *m_pPtr;
172  }
173 
177  inline bool operator!() const
178  {
179  return m_pPtr.IsNull();
180  }
181 
203  inline operator bool() const
204  {
205  return !m_pPtr.IsNull();
206  }
207 
211  inline void Reset(YI_ARRAY_TYPE pPtr[] = nullptr)
212  {
213  operator=(pPtr);
214  }
215 
219  inline YI_ARRAY_TYPE *Get() const
220  {
221  return m_pPtr.Get();
222  }
223 
227  inline YI_ARRAY_TYPE *Take()
228  {
229  return m_pPtr.Take();
230  }
231 
235  inline bool IsNull() const
236  {
237  return m_pPtr.IsNull();
238  }
239 
244  {
245  m_pPtr.Swap(rPtr.m_pPtr);
246  }
247 
273  inline YI_ARRAY_TYPE &operator[](int32_t nIndex)
274  {
275  YI_ASSERT(m_pPtr, "CYIScopedArray", "Attempted to read into a null scoped array.");
276  return m_pPtr.Get()[nIndex];
277  }
278 
304  inline const YI_ARRAY_TYPE &operator[](int32_t nIndex) const
305  {
306  YI_ASSERT(m_pPtr, "CYIScopedArray", "Attempted to read into a null scoped array.");
307  return m_pPtr.Get()[nIndex];
308  }
309 
310 private:
313 
315 };
316 
318 
319 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR, typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
321 {
322  return rLhs.Get() == rRhs.Get();
323 }
324 
325 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR, typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
327 {
328  return rLhs.Get() != rRhs.Get();
329 }
330 
331 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR, typename YI_R_ARRAY_TYPE>
332 inline bool operator==(const CYIScopedArray<YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR> &rLhs, const YI_R_ARRAY_TYPE pRhs[])
333 {
334  return rLhs.Get() == pRhs;
335 }
336 
337 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR, typename YI_R_ARRAY_TYPE>
338 inline bool operator!=(const CYIScopedArray<YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR> &rLhs, const YI_R_ARRAY_TYPE pRhs[])
339 {
340  return rLhs.Get() != pRhs;
341 }
342 
343 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
344 inline bool operator==(const YI_L_ARRAY_TYPE pLhs[], const CYIScopedArray<YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR> &rRhs)
345 {
346  return pLhs == rRhs.Get();
347 }
348 
349 template<typename YI_L_ARRAY_TYPE, typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
350 inline bool operator!=(const YI_L_ARRAY_TYPE pLhs[], const CYIScopedArray<YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR> &rRhs)
351 {
352  return pLhs != rRhs.Get();
353 }
354 
355 #if __cplusplus >= 201103L || defined(YI_UWP) || defined(YI_WIN32)
356 
357 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR>
358 inline bool operator==(const CYIScopedArray<YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR> &rLhs, const std::nullptr_t &pRhs)
359 {
360  return rLhs.Get() == pRhs;
361 }
362 
363 template<typename YI_L_ARRAY_TYPE, typename YI_L_DELETE_FUNCTOR>
364 inline bool operator!=(const CYIScopedArray<YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR> &rLhs, const std::nullptr_t &pRhs)
365 {
366  return rLhs.Get() != pRhs;
367 }
368 
369 template<typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
370 inline bool operator==(const std::nullptr_t &pLhs, const CYIScopedArray<YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR> &rRhs)
371 {
372  return pLhs == rRhs.Get();
373 }
374 
375 template<typename YI_R_ARRAY_TYPE, typename YI_R_DELETE_FUNCTOR>
376 inline bool operator!=(const std::nullptr_t &pLhs, const CYIScopedArray<YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR> &rRhs)
377 {
378  return pLhs != rRhs.Get();
379 }
380 
381 #endif // C++11 checks
382 
384 #endif /* _YI_SCOPED_ARRAY_H_ */
YI_PTR_TYPE * Get() const
Definition: YiScopedPtr.h:440
void Swap(CYIScopedPtr< YI_PTR_TYPE, YI_DELETE_FUNCTOR > &rPtr)
Definition: YiScopedPtr.h:530
void Swap(CYIScopedArray< YI_ARRAY_TYPE, YI_DELETE_FUNCTOR > &rPtr)
Definition: YiScopedArray.h:243
CYIScopedArray(YI_ARRAY_TYPE array[]=nullptr)
Definition: YiScopedArray.h:87
bool IsNull() const
Definition: YiScopedArray.h:235
CYIScopedArray & operator=(CYIScopedArray &&other)
Definition: YiScopedArray.h:149
STL namespace.
bool operator!=(const CYIScopedArray< YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR > &rLhs, const CYIScopedArray< YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR > &rRhs)
Definition: YiScopedArray.h:326
void Reset(YI_ARRAY_TYPE pPtr[]=nullptr)
Definition: YiScopedArray.h:211
CYIScopedArray(YI_ARRAY_TYPE array[], YI_DELETE_FUNCTOR &&deleter)
Definition: YiScopedArray.h:119
bool operator==(const CYIScopedArray< YI_L_ARRAY_TYPE, YI_L_DELETE_FUNCTOR > &rLhs, const CYIScopedArray< YI_R_ARRAY_TYPE, YI_R_DELETE_FUNCTOR > &rRhs)
Definition: YiScopedArray.h:320
CYIScopedArray & operator=(CYIScopedArray< YI_PTR_OTHER_TYPE, YI_OTHER_DELETER > &&other)
Definition: YiScopedArray.h:159
const YI_ARRAY_TYPE & operator[](int32_t nIndex) const
Definition: YiScopedArray.h:304
YI_ARRAY_TYPE & operator[](int32_t nIndex)
Definition: YiScopedArray.h:273
The CYIScopedArray is a smart pointer that takes sole ownership of a dynamically allocated array of o...
Definition: YiScopedArray.h:79
YI_PTR_TYPE * Take()
Definition: YiScopedPtr.h:468
bool operator!() const
Definition: YiScopedArray.h:177
YI_ARRAY_TYPE * Get() const
Definition: YiScopedArray.h:219
CYIScopedArray(YI_ARRAY_TYPE array[], const YI_DELETE_FUNCTOR &deleter)
Definition: YiScopedArray.h:98
YI_ARRAY_TYPE * Take()
Definition: YiScopedArray.h:227
CYIScopedArray(CYIScopedArray &&other)
Definition: YiScopedArray.h:108
#define YI_ASSERT(condition, tag, msg,...)
Platform-independent assertion macro.
Definition: YiError.h:37
bool IsNull() const
Definition: YiScopedPtr.h:495
CYIScopedArray(CYIScopedArray< YI_ARRAY_OTHER_TYPE, YI_OTHER_DELETER > &&other)
Definition: YiScopedArray.h:130
void operator=(YI_ARRAY_TYPE pPtr[])
Definition: YiScopedArray.h:138
YI_ARRAY_TYPE & operator*() const
Definition: YiScopedArray.h:168