Iterator.From.tlh 6.8 KB

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