Iterator.From.tlh 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #pragma once
  2. #include "Iterator.Base.tlh"
  3. #include "Iterator.Container.tlh"
  4. #include "Iterator.List.tlh"
  5. #include "Iterator.VectorOfPtr.tlh"
  6. #include "Iterator.ListOfPtr.tlh"
  7. #include "Iterator.Filter.tlh"
  8. #if _HAS_CXX17
  9. #include "Iterator.Function.tlh"
  10. #endif
  11. #include "Iterator.Extension.tlh"
  12. //-----------------------------------------------------------------------------
  13. // From
  14. //-----------------------------------------------------------------------------
  15. namespace Iterator
  16. {
  17. namespace Ext__ConstIterator
  18. {
  19. template <typename _Container>
  20. class Ext : public Extension <__ConstIterator <_Container>>
  21. {
  22. using inherited = Extension <__ConstIterator <_Container>>;
  23. public:
  24. // using Extension::Extension;
  25. Ext () { }
  26. Ext (const _Container & ar) { inherited::InitFrom (ar); }
  27. };
  28. }
  29. template <typename _Container>
  30. static Ext__ConstIterator::Ext <_Container> From (const _Container & ar)
  31. {
  32. return Ext__ConstIterator::Ext <_Container> (ar);
  33. }
  34. template <typename _Container>
  35. static Ext__ConstIterator::Ext <_Container> From (const _Container * ar)
  36. {
  37. if (ar == nullptr)
  38. return Ext__ConstIterator::Ext <_Container> ();
  39. else
  40. return Ext__ConstIterator::Ext <_Container> (*ar);
  41. }
  42. namespace Ext__Iterator
  43. {
  44. template <typename _Container>
  45. class Ext : public Extension <__Iterator <_Container>>
  46. {
  47. using inherited = Extension <__Iterator <_Container>>;
  48. public:
  49. // using Extension::Extension;
  50. Ext () { }
  51. Ext (_Container & ar) { inherited::InitFrom (ar); }
  52. };
  53. }
  54. template <typename _Container>
  55. static Ext__Iterator::Ext <_Container> From (_Container & ar)
  56. {
  57. return Ext__Iterator::Ext <_Container> (ar);
  58. }
  59. template <typename _Container>
  60. static Ext__Iterator::Ext <_Container> From (_Container * ar)
  61. {
  62. if (ar == nullptr)
  63. return Ext__Iterator::Ext <_Container> ();
  64. else
  65. return Ext__Iterator::Ext <_Container> (*ar);
  66. }
  67. };
  68. //-----------------------------------------------------------------------------
  69. // From - list
  70. //-----------------------------------------------------------------------------
  71. namespace Iterator
  72. {
  73. namespace Ext_L_ConstIterator
  74. {
  75. template <typename T>
  76. class Ext : public Extension <_L_ConstIterator <T>>
  77. {
  78. using inherited = Extension <_L_ConstIterator <T>>;
  79. public:
  80. Ext () { }
  81. Ext (const std::list <T> & ar) { inherited::InitFrom (ar); }
  82. };
  83. }
  84. template <typename T>
  85. static Ext_L_ConstIterator::Ext <T> From (const std::list <T> & ar)
  86. {
  87. return Ext_L_ConstIterator::Ext <T> (ar);
  88. }
  89. template <typename T>
  90. static Ext_L_ConstIterator::Ext <T> From (const std::list <T> * ar)
  91. {
  92. if (ar == nullptr)
  93. return Ext_L_ConstIterator::Ext <T> ();
  94. else
  95. return Ext_L_ConstIterator::Ext <T> (*ar);
  96. }
  97. namespace Ext_L_Iterator
  98. {
  99. template <typename T>
  100. class Ext : public Extension <_L_Iterator <T>>
  101. {
  102. using inherited = Extension <_L_Iterator <T>>;
  103. public:
  104. Ext () { }
  105. Ext (std::list <T> & ar) { inherited::InitFrom (ar); }
  106. };
  107. }
  108. template <typename T>
  109. static Ext_L_Iterator::Ext <T> From (std::list <T> & ar)
  110. {
  111. return Ext_L_Iterator::Ext <T> (ar);
  112. }
  113. template <typename T>
  114. static Ext_L_Iterator::Ext <T> From (std::list <T> * ar)
  115. {
  116. if (ar == nullptr)
  117. return Ext_L_Iterator::Ext <T> ();
  118. else
  119. return Ext_L_Iterator::Ext <T> (*ar);
  120. }
  121. };
  122. //-----------------------------------------------------------------------------
  123. // From - VectorOfPtr
  124. //-----------------------------------------------------------------------------
  125. namespace Iterator
  126. {
  127. namespace Ext_VP_ConstIterator
  128. {
  129. template <typename T>
  130. class Ext : public Extension <_VP_ConstIterator <T>>
  131. {
  132. using inherited = Extension <_VP_ConstIterator <T>>;
  133. public:
  134. Ext () { }
  135. Ext (const VectorOfPtr <T> & ar) { inherited::InitFrom (ar); }
  136. };
  137. }
  138. template <typename T>
  139. static Ext_VP_ConstIterator::Ext <T> From (const VectorOfPtr <T> & ar)
  140. {
  141. return Ext_VP_ConstIterator::Ext <T> (ar);
  142. }
  143. template <typename T>
  144. static _VP_ConstIterator <T> From (const VectorOfPtr <T> * ar)
  145. {
  146. if (ar == nullptr)
  147. return Ext_VP_ConstIterator::Ext <T> ();
  148. else
  149. return Ext_VP_ConstIterator::Ext <T> (*ar);
  150. }
  151. namespace Ext_VP_Iterator
  152. {
  153. template <typename T>
  154. class Ext : public Extension <_VP_Iterator <T>>
  155. {
  156. using inherited = Extension <_VP_Iterator <T>>;
  157. public:
  158. Ext () { }
  159. Ext (VectorOfPtr <T> & ar) { inherited::InitFrom (ar); }
  160. };
  161. }
  162. template <typename T>
  163. static Ext_VP_Iterator::Ext <T> From (VectorOfPtr <T> & ar)
  164. {
  165. return Ext_VP_Iterator::Ext <T> (ar);
  166. }
  167. template <typename T>
  168. static Ext_VP_Iterator::Ext <T> From (VectorOfPtr <T> * ar)
  169. {
  170. if (ar == nullptr)
  171. return Ext_VP_Iterator::Ext <T> ();
  172. else
  173. return Ext_VP_Iterator::Ext <T> (*ar);
  174. }
  175. };
  176. //-----------------------------------------------------------------------------
  177. // From - ListOfPtr
  178. //-----------------------------------------------------------------------------
  179. namespace Iterator
  180. {
  181. namespace Ext_LP_ConstIterator
  182. {
  183. template <typename T>
  184. class Ext : public Extension <_LP_ConstIterator <T>>
  185. {
  186. using inherited = Extension <_LP_ConstIterator <T>>;
  187. public:
  188. Ext () { }
  189. Ext (const ListOfPtr <T> & ar) { inherited::InitFrom (ar); }
  190. };
  191. }
  192. template <typename T>
  193. static Ext_LP_ConstIterator::Ext <T> From (const ListOfPtr <T> & ar)
  194. {
  195. return Ext_LP_ConstIterator::Ext <T> (ar);
  196. }
  197. template <typename T>
  198. static Ext_LP_ConstIterator::Ext <T> From (const ListOfPtr <T> * ar)
  199. {
  200. if (ar == nullptr)
  201. return Ext_LP_ConstIterator::Ext <T> ();
  202. else
  203. return Ext_LP_ConstIterator::Ext <T> (*ar);
  204. }
  205. namespace Ext_LP_Iterator
  206. {
  207. template <typename T>
  208. class Ext : public Extension <_LP_Iterator <T>>
  209. {
  210. using inherited = Extension <_LP_Iterator <T>>;
  211. public:
  212. Ext () { }
  213. Ext (ListOfPtr <T> & ar) { inherited::InitFrom (ar); }
  214. };
  215. }
  216. template <typename T>
  217. static Ext_LP_Iterator::Ext <T> From (ListOfPtr <T> & ar)
  218. {
  219. return Ext_LP_Iterator::Ext <T> (ar);
  220. }
  221. template <typename T>
  222. static Ext_LP_Iterator::Ext <T> From (ListOfPtr <T> * ar)
  223. {
  224. if (ar == nullptr)
  225. return Ext_LP_Iterator::Ext <T> ();
  226. else
  227. return Ext_LP_Iterator::Ext <T> (*ar);
  228. }
  229. };
  230. #if _HAS_CXX17
  231. //-----------------------------------------------------------------------------
  232. // From - Function
  233. //-----------------------------------------------------------------------------
  234. namespace Iterator
  235. {
  236. namespace Ext_Fun_Iterator
  237. {
  238. template <typename T>
  239. class Ext : public Extension <Function_Iterator <T>>
  240. {
  241. using inherited = Extension <Function_Iterator <T>>;
  242. public:
  243. Ext () { }
  244. Ext (typename Function_Iterator <T>::FuncType & fun) { inherited::InitFrom (fun); }
  245. };
  246. }
  247. template <typename T>
  248. static Ext_Fun_Iterator::Ext <T> From (const std::function <std::optional <T> ()> & fun)
  249. {
  250. return Ext_Fun_Iterator::Ext <T> (fun);
  251. }
  252. template <typename T>
  253. static Ext_Fun_Iterator::Ext <T> From (std::function <std::optional <T> ()> && fun)
  254. {
  255. return Ext_Fun_Iterator::Ext <T> (fun);
  256. }
  257. };
  258. #endif
  259. //-----------------------------------------------------------------------------
  260. // TypeFrom
  261. //-----------------------------------------------------------------------------
  262. namespace Iterator
  263. {
  264. template <typename T>
  265. struct TypeFrom
  266. {
  267. using Type = decltype (::Iterator::From ((T *) nullptr));
  268. using ConstType = decltype (::Iterator::From ((const T *) nullptr));
  269. };
  270. };
  271. // 以下写法也可以,
  272. // using IterType = decltype (::Iterator::From ((VectorOfPtr <DICOMVRSet> *) nullptr));
  273. // 下面的写法更漂亮
  274. // using IterType = ::Iterator::TypeFrom <VectorOfPtr <DICOMVRSet>>::Type;