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