#pragma once #include "Iterator.Base.tlh" #include "Iterator.Container.tlh" #include "Iterator.List.tlh" #include "Iterator.VectorOfPtr.tlh" #include "Iterator.ListOfPtr.tlh" #include "Iterator.Filter.tlh" #if _HAS_CXX17 #include "Iterator.Function.tlh" #endif #include "Iterator.Extension.tlh" //----------------------------------------------------------------------------- // From //----------------------------------------------------------------------------- namespace Iterator { namespace Ext__ConstIterator { template class Ext : public Extension <__ConstIterator <_Container>> { public: // using Extension::Extension; Ext () { } Ext (const _Container & ar) { InitFrom (ar); } }; } template static Ext__ConstIterator::Ext <_Container> From (const _Container & ar) { return Ext__ConstIterator::Ext <_Container> (ar); } template static Ext__ConstIterator::Ext <_Container> From (const _Container * ar) { if (ar == nullptr) return Ext__ConstIterator::Ext <_Container> (); else return Ext__ConstIterator::Ext <_Container> (*ar); } namespace Ext__Iterator { template class Ext : public Extension <__Iterator <_Container>> { public: // using Extension::Extension; Ext () { } Ext (_Container & ar) { InitFrom (ar); } }; } template static Ext__Iterator::Ext <_Container> From (_Container & ar) { return Ext__Iterator::Ext <_Container> (ar); } template static Ext__Iterator::Ext <_Container> From (_Container * ar) { if (ar == nullptr) return Ext__Iterator::Ext <_Container> (); else return Ext__Iterator::Ext <_Container> (*ar); } }; //----------------------------------------------------------------------------- // From - list //----------------------------------------------------------------------------- namespace Iterator { namespace Ext_L_ConstIterator { template class Ext : public Extension <_L_ConstIterator > { public: Ext () { } Ext (const std::list & ar) { InitFrom (ar); } }; } template static Ext_L_ConstIterator::Ext From (const std::list & ar) { return Ext_L_ConstIterator::Ext (ar); } template static Ext_L_ConstIterator::Ext From (const std::list * ar) { if (ar == nullptr) return Ext_L_ConstIterator::Ext (); else return Ext_L_ConstIterator::Ext (*ar); } namespace Ext_L_Iterator { template class Ext : public Extension <_L_Iterator > { public: Ext () { } Ext (std::list & ar) { InitFrom (ar); } }; } template static Ext_L_Iterator::Ext From (std::list & ar) { return Ext_L_Iterator::Ext (ar); } template static Ext_L_Iterator::Ext From (std::list * ar) { if (ar == nullptr) return Ext_L_Iterator::Ext (); else return Ext_L_Iterator::Ext (*ar); } }; //----------------------------------------------------------------------------- // From - VectorOfPtr //----------------------------------------------------------------------------- namespace Iterator { namespace Ext_VP_ConstIterator { template class Ext : public Extension <_VP_ConstIterator > { public: Ext () { } Ext (const VectorOfPtr & ar) { InitFrom (ar); } }; } template static Ext_VP_ConstIterator::Ext From (const VectorOfPtr & ar) { return Ext_VP_ConstIterator::Ext (ar); } template static _VP_ConstIterator From (const VectorOfPtr * ar) { if (ar == nullptr) return Ext_VP_ConstIterator::Ext (); else return Ext_VP_ConstIterator::Ext (*ar); } namespace Ext_VP_Iterator { template class Ext : public Extension <_VP_Iterator > { public: Ext () { } Ext (VectorOfPtr & ar) { InitFrom (ar); } }; } template static Ext_VP_Iterator::Ext From (VectorOfPtr & ar) { return Ext_VP_Iterator::Ext (ar); } template static Ext_VP_Iterator::Ext From (VectorOfPtr * ar) { if (ar == nullptr) return Ext_VP_Iterator::Ext (); else return Ext_VP_Iterator::Ext (*ar); } }; //----------------------------------------------------------------------------- // From - ListOfPtr //----------------------------------------------------------------------------- namespace Iterator { namespace Ext_LP_ConstIterator { template class Ext : public Extension <_LP_ConstIterator > { public: Ext () { } Ext (const ListOfPtr & ar) { InitFrom (ar); } }; } template static Ext_LP_ConstIterator::Ext From (const ListOfPtr & ar) { return Ext_LP_ConstIterator::Ext (ar); } template static Ext_LP_ConstIterator::Ext From (const ListOfPtr * ar) { if (ar == nullptr) return Ext_LP_ConstIterator::Ext (); else return Ext_LP_ConstIterator::Ext (*ar); } namespace Ext_LP_Iterator { template class Ext : public Extension <_LP_Iterator > { public: Ext () { } Ext (ListOfPtr & ar) { InitFrom (ar); } }; } template static Ext_LP_Iterator::Ext From (ListOfPtr & ar) { return Ext_LP_Iterator::Ext (ar); } template static Ext_LP_Iterator::Ext From (ListOfPtr * ar) { if (ar == nullptr) return Ext_LP_Iterator::Ext (); else return Ext_LP_Iterator::Ext (*ar); } }; #if _HAS_CXX17 //----------------------------------------------------------------------------- // From - Function //----------------------------------------------------------------------------- namespace Iterator { namespace Ext_Fun_Iterator { template class Ext : public Extension > { public: Ext () { } Ext (Function_Iterator::FuncType & fun) { InitFrom (fun); } }; } template static Ext_Fun_Iterator::Ext From (const std::function ()> & fun) { return Ext_Fun_Iterator::Ext (fun); } template static Ext_Fun_Iterator::Ext From (std::function ()> && fun) { return Ext_Fun_Iterator::Ext (fun); } }; #endif //----------------------------------------------------------------------------- // TypeFrom //----------------------------------------------------------------------------- namespace Iterator { template struct TypeFrom { using Type = decltype (::Iterator::From ((T *) nullptr)); using ConstType = decltype (::Iterator::From ((const T *) nullptr)); }; }; // 以下写法也可以, // using IterType = decltype (::Iterator::From ((VectorOfPtr *) nullptr)); // 下面的写法更漂亮 // using IterType = ::Iterator::TypeFrom >::Type;