/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2014/02/19
/// 
/// @brief  スマートポインタ関連。
/// 
/// ****************************************************************************

#pragma once

#include "../Base/CPL_Core_Traits.h"
#include "CPL_Core_PointerBase.h"
#include "CPL_Core_PointerCom.h"
//#include "CPL_Core_PointerAuto.h"
//#include "CPL_Core_PointerRefCnt.h"
//#include "CPL_Core_PointerLinked.h"
//#include "CPL_Core_PointerMultifunc.h"
//#include "CPL_Core_PointerMultifuncList.h"
//#include "CPL_Core_PointerMultifuncTree.h"
//#include "CPL_Core_PointerCom.h"
#include "CPL_Core_SmartLinkTree.h"


namespace CPL {
namespace Core {


//template<class T_Type>
//class SmartPtr {
//public:
//  //// =============================================================================
//  //// 共有不可の簡易スマートポインタ
//  //// =============================================================================
//  //typedef sp::Auto< T_Type >   Auto;
//  //typedef sp::AutoMT< T_Type > AutoMT;
//
//
//  //// =============================================================================
//  //// 参照カウンタ型スマートポインタ
//  //// =============================================================================
//  //typedef sp::RefCnt< T_Type >   RefCnt;
//  //typedef sp::RefCntMT< T_Type > RefCntMT;
//
//
//  //// =============================================================================
//  //// 双方向リスト型スマートポインタ
//  //// =============================================================================
//  //typedef sp::Linked< T_Type > Linked;
//
//
//  //// =============================================================================
//  //// ポインタテーブル型
//  //// =============================================================================
//  //typedef sp::Multifunc    < T_Type > Multifunc;
//  //typedef sp::MultifuncList< T_Type > MultifuncList;
//  //typedef sp::MultifuncTree< T_Type > MultifuncTree;
//
//  
//  // =============================================================================
//  // COM用
//  // =============================================================================
//  typedef sp::Com< T_Type > Com;
//};



//// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//#define CPL_SMARTPOINTER_BASIC_DEFINES_DETAILS_CVandRef(basic_name,type)\
//  using basic_name##_ptr     = std::basic_name##_ptr<type>;\
//  using basic_name##_cptr    = std::basic_name##_ptr<type const>;\
//  using basic_name##_vptr    = std::basic_name##_ptr<type volatile>;\
//  using basic_name##_cvptr   = std::basic_name##_ptr<type cpl_cv>;\
//  using basic_name##_pref    = basic_name##_ptr&;\
//  using basic_name##_pcref   = basic_name##_ptr const&;\
//  using basic_name##_cpref   = basic_name##_cptr&;\
//  using basic_name##_cpcref  = basic_name##_cptr const&;\
//  using basic_name##_vpref   = basic_name##_vptr&;\
//  using basic_name##_vpcref  = basic_name##_vptr const&;\
//  using basic_name##_cvpref  = basic_name##_cvptr&;\
//  using basic_name##_cvpcref = basic_name##_cvptr const&
//
//// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//// スマートポインタ基本定義用簡易化マクロ（定義スコープ内での使用を想定）
//#define CPL_SMARTPOINTER_BASIC_DEFINES(type) \
//  using XPtr = CPL::Core::XPtr< type >;\
//  CPL_SMARTPOINTER_BASIC_DEFINES_DETAILS_CVandRef(shared,type);\
//  CPL_SMARTPOINTER_BASIC_DEFINES_DETAILS_CVandRef(weak,type);\
//  CPL_SMARTPOINTER_BASIC_DEFINES_DETAILS_CVandRef(unique,type)



} // namespace Core


//
template<class T> using sdptr  = std::shared_ptr<T>;
template<class T> using sdcptr = std::shared_ptr<T const>;
template<class T> using wkptr  = std::weak_ptr<T>;
template<class T> using wkcptr = std::weak_ptr<T const>;
template<class T, class... D> using uqptr  = std::unique_ptr<T, D...>;
template<class T, class... D> using uqcptr = std::unique_ptr<T const, D...>;

template<class T> using comptr = CPL::Core::ComPtr<T>;

//#define CPL_TYPE_PTR_REF2_EX_(type,name)\
//  template<class... T> using name##_ptr   = type<T...>*;\
//  template<class... T> using name##_cptr  = type<T...> const*;\
//  template<class... T> using name##_vptr  = type<T...> volatile*;\
//  template<class... T> using name##_cvptr = type<T...> cpl_cv*;\
//  template<class... T> using name##_ref   = type<T...>&;\
//  template<class... T> using name##_cref  = type<T...> const&;\
//  template<class... T> using name##_vref  = type<T...> volatile&;\
//  template<class... T> using name##_cvref = type<T...> cpl_cv&
//
//#define CPL_TYPE_PTR_REF1_EX_(name) CPL_TYPE_PTR_REF2_EX_(name,name)
//
//CPL_TYPE_PTR_REF1_EX_(sdptr );
//CPL_TYPE_PTR_REF1_EX_(sdcptr);
//CPL_TYPE_PTR_REF1_EX_(wkptr );
//CPL_TYPE_PTR_REF1_EX_(wkcptr);
//CPL_TYPE_PTR_REF1_EX_(uqptr );
//CPL_TYPE_PTR_REF1_EX_(uqcptr);


} // namespace CPL
