llptrto.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:3k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   llptrto.h
  3.  * @author Nat Goodspeed
  4.  * @date   2008-08-19
  5.  * @brief  LLPtrTo<TARGET> is a template helper to pick either TARGET* or -- when
  6.  *         TARGET is a subclass of LLRefCount or LLThreadSafeRefCount --
  7.  *         LLPointer<TARGET>. LLPtrTo<> chooses whichever pointer type is best.
  8.  * 
  9.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  10.  * 
  11.  * Copyright (c) 2008-2010, Linden Research, Inc.
  12.  * 
  13.  * Second Life Viewer Source Code
  14.  * The source code in this file ("Source Code") is provided by Linden Lab
  15.  * to you under the terms of the GNU General Public License, version 2.0
  16.  * ("GPL"), unless you have obtained a separate licensing agreement
  17.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  18.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  19.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  20.  * 
  21.  * There are special exceptions to the terms and conditions of the GPL as
  22.  * it is applied to this Source Code. View the full text of the exception
  23.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  24.  * online at
  25.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  26.  * 
  27.  * By copying, modifying or distributing this software, you acknowledge
  28.  * that you have read and understood your obligations described above,
  29.  * and agree to abide by those obligations.
  30.  * 
  31.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  32.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  33.  * COMPLETENESS OR PERFORMANCE.
  34.  * $/LicenseInfo$
  35.  */
  36. #if ! defined(LL_LLPTRTO_H)
  37. #define LL_LLPTRTO_H
  38. #include "llpointer.h"
  39. #include "llrefcount.h"             // LLRefCount
  40. #include "llthread.h"               // LLThreadSafeRefCount
  41. #include <boost/type_traits/is_base_of.hpp>
  42. #include <boost/type_traits/remove_pointer.hpp>
  43. #include <boost/utility/enable_if.hpp>
  44. /**
  45.  * LLPtrTo<TARGET>::type is either of two things:
  46.  *
  47.  * * When TARGET is a subclass of either LLRefCount or LLThreadSafeRefCount,
  48.  *   LLPtrTo<TARGET>::type is LLPointer<TARGET>.
  49.  * * Otherwise, LLPtrTo<TARGET>::type is TARGET*.
  50.  *
  51.  * This way, a class template can use LLPtrTo<TARGET>::type to select an
  52.  * appropriate pointer type to store.
  53.  */
  54. template <class T, class ENABLE=void>
  55. struct LLPtrTo
  56. {
  57.     typedef T* type;
  58. };
  59. /// specialize for subclasses of LLRefCount
  60. template <class T>
  61. struct LLPtrTo<T, typename boost::enable_if< boost::is_base_of<LLRefCount, T> >::type>
  62. {
  63.     typedef LLPointer<T> type;
  64. };
  65. /// specialize for subclasses of LLThreadSafeRefCount
  66. template <class T>
  67. struct LLPtrTo<T, typename boost::enable_if< boost::is_base_of<LLThreadSafeRefCount, T> >::type>
  68. {
  69.     typedef LLPointer<T> type;
  70. };
  71. /**
  72.  * LLRemovePointer<PTRTYPE>::type gets you the underlying (pointee) type.
  73.  */
  74. template <typename PTRTYPE>
  75. struct LLRemovePointer
  76. {
  77.     typedef typename boost::remove_pointer<PTRTYPE>::type type;
  78. };
  79. /// specialize for LLPointer<SOMECLASS>
  80. template <typename SOMECLASS>
  81. struct LLRemovePointer< LLPointer<SOMECLASS> >
  82. {
  83.     typedef SOMECLASS type;
  84. };
  85. #endif /* ! defined(LL_LLPTRTO_H) */