the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#ifndef BOOST_RANGE_ATL_HPP
2#define BOOST_RANGE_ATL_HPP
3
4
5
6
7// Boost.Range ATL Extension
8//
9// Copyright Shunsuke Sogame 2005-2006.
10// Distributed under the Boost Software License, Version 1.0.
11// (See accompanying file LICENSE_1_0.txt or copy at
12// http://www.boost.org/LICENSE_1_0.txt)
13
14
15
16
17// config
18//
19
20
21#include <atldef.h> // _ATL_VER
22
23
24#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
25 #if (_ATL_VER < 0x0700)
26 #define BOOST_RANGE_ATL_NO_COLLECTIONS
27 #endif
28#endif
29
30
31#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
32 #if (_ATL_VER < 0x0700) // dubious
33 #define BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX
34 #endif
35#endif
36
37
38#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
39 #if (_MSC_VER < 1310) // from <boost/regex/mfc.hpp>, but dubious
40 #define BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING
41 #endif
42#endif
43
44
45
46
47// forward declarations
48//
49
50
51#include <basetyps.h> // IID
52
53
54namespace ATL {
55
56
57#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
58
59
60 // arrays
61 //
62 template< class E, class ETraits >
63 class CAtlArray;
64
65 template< class E >
66 class CAutoPtrArray;
67
68 template< class I, const IID *piid >
69 class CInterfaceArray;
70
71
72 // lists
73 //
74 template< class E, class ETraits >
75 class CAtlList;
76
77 template< class E >
78 class CAutoPtrList;
79
80 template< class E, class Allocator >
81 class CHeapPtrList;
82
83 template< class I, const IID *piid >
84 class CInterfaceList;
85
86
87 // maps
88 //
89 template< class K, class V, class KTraits, class VTraits >
90 class CAtlMap;
91
92 template< class K, class V, class KTraits, class VTraits >
93 class CRBTree;
94
95 template< class K, class V, class KTraits, class VTraits >
96 class CRBMap;
97
98 template< class K, class V, class KTraits, class VTraits >
99 class CRBMultiMap;
100
101
102 // strings
103 //
104#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
105 template< class BaseType, bool t_bMFCDLL >
106 class CSimpleStringT;
107#else
108 template< class BaseType >
109 class CSimpleStringT;
110#endif
111
112 template< class BaseType, class StringTraits >
113 class CStringT;
114
115 template< class StringType, int t_nChars >
116 class CFixedStringT;
117
118 template< class BaseType, const int t_nSize >
119 class CStaticString;
120
121
122#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
123
124
125 // simples
126 //
127#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
128
129 template< class T, class TEqual >
130 class CSimpleArray;
131
132 template< class TKey, class TVal, class TEqual >
133 class CSimpleMap;
134
135#else
136
137 template< class T >
138 class CSimpleArray;
139
140 template< class T >
141 class CSimpleValArray;
142
143 template< class TKey, class TVal >
144 class CSimpleMap;
145
146#endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
147
148
149 // pointers
150 //
151 template< class E >
152 class CAutoPtr;
153
154 template< class T >
155 class CComPtr;
156
157 template< class T, const IID *piid >
158 class CComQIPtr;
159
160 template< class E, class Allocator >
161 class CHeapPtr;
162
163 template< class T >
164 class CAdapt;
165
166
167} // namespace ATL
168
169
170
171
172// indirect_iterator customizations
173//
174
175
176#include <boost/mpl/identity.hpp>
177#include <boost/pointee.hpp>
178
179
180namespace boost {
181
182
183 template< class E >
184 struct pointee< ATL::CAutoPtr<E> > :
185 mpl::identity<E>
186 { };
187
188 template< class T >
189 struct pointee< ATL::CComPtr<T> > :
190 mpl::identity<T>
191 { };
192
193 template< class T, const IID *piid >
194 struct pointee< ATL::CComQIPtr<T, piid> > :
195 mpl::identity<T>
196 { };
197
198 template< class E, class Allocator >
199 struct pointee< ATL::CHeapPtr<E, Allocator> > :
200 mpl::identity<E>
201 { };
202
203 template< class T >
204 struct pointee< ATL::CAdapt<T> > :
205 pointee<T>
206 { };
207
208
209} // namespace boost
210
211
212
213
214// extended customizations
215//
216
217
218#include <boost/iterator/indirect_iterator.hpp>
219#include <boost/iterator/zip_iterator.hpp>
220#include <boost/range/detail/microsoft.hpp>
221#include <boost/tuple/tuple.hpp>
222#include <atlbase.h> // CComBSTR
223
224
225namespace boost { namespace range_detail_microsoft {
226
227
228#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
229
230
231 // arrays
232 //
233
234 struct atl_array_functions :
235 array_functions
236 {
237 template< class Iterator, class X >
238 Iterator end(X& x) // redefine
239 {
240 return x.GetData() + x.GetCount(); // no 'GetSize()'
241 }
242 };
243
244
245 template< class E, class ETraits >
246 struct customization< ATL::CAtlArray<E, ETraits> > :
247 atl_array_functions
248 {
249 template< class X >
250 struct meta
251 {
252 typedef E val_t;
253
254 typedef val_t *mutable_iterator;
255 typedef val_t const *const_iterator;
256 };
257 };
258
259
260 template< class E >
261 struct customization< ATL::CAutoPtrArray<E> > :
262 atl_array_functions
263 {
264 template< class X >
265 struct meta
266 {
267 // ATL::CAutoPtr/CHeapPtr is no assignable.
268 typedef ATL::CAutoPtr<E> val_t;
269 typedef val_t *miter_t;
270 typedef val_t const *citer_t;
271
272 typedef indirect_iterator<miter_t> mutable_iterator;
273 typedef indirect_iterator<citer_t> const_iterator;
274 };
275 };
276
277
278 template< class I, const IID *piid >
279 struct customization< ATL::CInterfaceArray<I, piid> > :
280 atl_array_functions
281 {
282 template< class X >
283 struct meta
284 {
285 typedef ATL::CComQIPtr<I, piid> val_t;
286
287 typedef val_t *mutable_iterator;
288 typedef val_t const *const_iterator;
289 };
290 };
291
292
293 template< class E, class ETraits >
294 struct customization< ATL::CAtlList<E, ETraits> > :
295 list_functions
296 {
297 template< class X >
298 struct meta
299 {
300 typedef E val_t;
301
302 typedef list_iterator<X, val_t> mutable_iterator;
303 typedef list_iterator<X const, val_t const> const_iterator;
304 };
305 };
306
307
308 struct indirected_list_functions
309 {
310 template< class Iterator, class X >
311 Iterator begin(X& x)
312 {
313 typedef typename Iterator::base_type base_t; // == list_iterator
314 return Iterator(base_t(x, x.GetHeadPosition()));
315 }
316
317 template< class Iterator, class X >
318 Iterator end(X& x)
319 {
320 typedef typename Iterator::base_type base_t;
321 return Iterator(base_t(x, POSITION(0)));
322 }
323 };
324
325
326 template< class E >
327 struct customization< ATL::CAutoPtrList<E> > :
328 indirected_list_functions
329 {
330 template< class X >
331 struct meta
332 {
333 typedef ATL::CAutoPtr<E> val_t;
334 typedef list_iterator<X, val_t> miter_t;
335 typedef list_iterator<X const, val_t const> citer_t;
336
337 typedef indirect_iterator<miter_t> mutable_iterator;
338 typedef indirect_iterator<citer_t> const_iterator;
339 };
340 };
341
342
343 template< class E, class Allocator >
344 struct customization< ATL::CHeapPtrList<E, Allocator> > :
345 indirected_list_functions
346 {
347 template< class X >
348 struct meta
349 {
350 typedef ATL::CHeapPtr<E, Allocator> val_t;
351 typedef list_iterator<X, val_t> miter_t;
352 typedef list_iterator<X const, val_t const> citer_t;
353
354 typedef indirect_iterator<miter_t> mutable_iterator;
355 typedef indirect_iterator<citer_t> const_iterator;
356 };
357 };
358
359
360 template< class I, const IID *piid >
361 struct customization< ATL::CInterfaceList<I, piid> > :
362 list_functions
363 {
364 template< class X >
365 struct meta
366 {
367 typedef ATL::CComQIPtr<I, piid> val_t;
368
369 typedef list_iterator<X, val_t> mutable_iterator;
370 typedef list_iterator<X const, val_t const> const_iterator;
371 };
372 };
373
374
375 // maps
376 //
377
378 struct atl_rb_tree_tag
379 { };
380
381 template< >
382 struct customization< atl_rb_tree_tag > :
383 indirected_list_functions
384 {
385 template< class X >
386 struct meta
387 {
388 typedef typename X::CPair val_t;
389
390 typedef list_iterator<X, val_t *, val_t *> miter_t;
391 typedef list_iterator<X const, val_t const *, val_t const *> citer_t;
392
393 typedef indirect_iterator<miter_t> mutable_iterator;
394 typedef indirect_iterator<citer_t> const_iterator;
395 };
396 };
397
398
399 template< class K, class V, class KTraits, class VTraits >
400 struct customization< ATL::CAtlMap<K, V, KTraits, VTraits> > :
401 customization< atl_rb_tree_tag >
402 {
403 template< class Iterator, class X >
404 Iterator begin(X& x) // redefine
405 {
406 typedef typename Iterator::base_type base_t; // == list_iterator
407 return Iterator(base_t(x, x.GetStartPosition())); // no 'GetHeadPosition'
408 }
409 };
410
411
412 // strings
413 //
414
415 struct atl_string_tag
416 { };
417
418 template< >
419 struct customization< atl_string_tag >
420 {
421 template< class X >
422 struct meta
423 {
424 typedef typename X::PXSTR mutable_iterator;
425 typedef typename X::PCXSTR const_iterator;
426 };
427
428 template< class Iterator, class X >
429 typename mutable_<Iterator, X>::type begin(X& x)
430 {
431 return x.GetBuffer(0);
432 }
433
434 template< class Iterator, class X >
435 Iterator begin(X const& x)
436 {
437 return x.GetString();
438 }
439
440 template< class Iterator, class X >
441 Iterator end(X& x)
442 {
443 return begin<Iterator>(x) + x.GetLength();
444 }
445 };
446
447
448 template< class BaseType, const int t_nSize >
449 struct customization< ATL::CStaticString<BaseType, t_nSize> >
450 {
451 template< class X >
452 struct meta
453 {
454 typedef BaseType const *mutable_iterator;
455 typedef mutable_iterator const_iterator;
456 };
457
458 template< class Iterator, class X >
459 Iterator begin(X const& x)
460 {
461 return x;
462 }
463
464 template< class Iterator, class X >
465 Iterator end(X const& x)
466 {
467 return begin<Iterator>(x) + X::GetLength();
468 }
469 };
470
471
472#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
473
474
475 template< >
476 struct customization< ATL::CComBSTR >
477 {
478 template< class X >
479 struct meta
480 {
481 typedef OLECHAR *mutable_iterator;
482 typedef OLECHAR const *const_iterator;
483 };
484
485 template< class Iterator, class X >
486 Iterator begin(X& x)
487 {
488 return x.operator BSTR();
489 }
490
491 template< class Iterator, class X >
492 Iterator end(X& x)
493 {
494 return begin<Iterator>(x) + x.Length();
495 }
496 };
497
498
499 // simples
500 //
501
502#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
503 template< class T, class TEqual >
504 struct customization< ATL::CSimpleArray<T, TEqual> > :
505#else
506 template< class T >
507 struct customization< ATL::CSimpleArray<T> > :
508#endif
509 array_functions
510 {
511 template< class X >
512 struct meta
513 {
514 typedef T val_t;
515
516 typedef val_t *mutable_iterator;
517 typedef val_t const *const_iterator;
518 };
519 };
520
521
522#if defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
523
524 template< class T >
525 struct customization< ATL::CSimpleValArray<T> > :
526 array_functions
527 {
528 template< class X >
529 struct meta
530 {
531 typedef T val_t;
532
533 typedef val_t *mutable_iterator;
534 typedef val_t const *const_iterator;
535 };
536 };
537
538#endif // defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
539
540
541#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
542 template< class TKey, class TVal, class TEqual >
543 struct customization< ATL::CSimpleMap<TKey, TVal, TEqual> >
544#else
545 template< class TKey, class TVal >
546 struct customization< ATL::CSimpleMap<TKey, TVal> >
547#endif
548 {
549 template< class X >
550 struct meta
551 {
552 typedef TKey k_val_t;
553 typedef k_val_t *k_miter_t;
554 typedef k_val_t const *k_citer_t;
555
556 typedef TVal v_val_t;
557 typedef v_val_t *v_miter_t;
558 typedef v_val_t const *v_citer_t;
559
560 // Topic:
561 // 'std::pair' can't contain references
562 // because of reference to reference problem.
563
564 typedef zip_iterator< tuple<k_miter_t, v_miter_t> > mutable_iterator;
565 typedef zip_iterator< tuple<k_citer_t, v_citer_t> > const_iterator;
566 };
567
568 template< class Iterator, class X >
569 Iterator begin(X& x)
570 {
571 return Iterator(boost::make_tuple(x.m_aKey, x.m_aVal));
572 }
573
574 template< class Iterator, class X >
575 Iterator end(X& x)
576 {
577 return Iterator(boost::make_tuple(x.m_aKey + x.GetSize(), x.m_aVal + x.GetSize()));
578 }
579 };
580
581
582} } // namespace boost::range_detail_microsoft
583
584
585
586
587// range customizations
588//
589
590
591#if !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
592
593
594 // arrays
595 //
596 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
597 boost::range_detail_microsoft::using_type_as_tag,
598 (ATL, BOOST_PP_NIL), CAtlArray, 2
599 )
600
601 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
602 boost::range_detail_microsoft::using_type_as_tag,
603 (ATL, BOOST_PP_NIL), CAutoPtrArray, 1
604 )
605
606 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
607 boost::range_detail_microsoft::using_type_as_tag,
608 (ATL, BOOST_PP_NIL), CInterfaceArray, (class)(const IID *)
609 )
610
611
612 // lists
613 //
614 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
615 boost::range_detail_microsoft::using_type_as_tag,
616 (ATL, BOOST_PP_NIL), CAtlList, 2
617 )
618
619 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
620 boost::range_detail_microsoft::using_type_as_tag,
621 (ATL, BOOST_PP_NIL), CAutoPtrList, 1
622 )
623
624 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
625 boost::range_detail_microsoft::using_type_as_tag,
626 (ATL, BOOST_PP_NIL), CHeapPtrList, 2
627 )
628
629 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
630 boost::range_detail_microsoft::using_type_as_tag,
631 (ATL, BOOST_PP_NIL), CInterfaceList, (class)(const IID *)
632 )
633
634
635 //maps
636 //
637 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
638 boost::range_detail_microsoft::using_type_as_tag,
639 (ATL, BOOST_PP_NIL), CAtlMap, 4
640 )
641
642 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
643 boost::range_detail_microsoft::atl_rb_tree_tag,
644 (ATL, BOOST_PP_NIL), CRBTree, 4
645 )
646
647 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
648 boost::range_detail_microsoft::atl_rb_tree_tag,
649 (ATL, BOOST_PP_NIL), CRBMap, 4
650 )
651
652 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
653 boost::range_detail_microsoft::atl_rb_tree_tag,
654 (ATL, BOOST_PP_NIL), CRBMultiMap, 4
655 )
656
657
658 // strings
659 //
660 #if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLESTRING)
661 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
662 boost::range_detail_microsoft::atl_string_tag,
663 (ATL, BOOST_PP_NIL), CSimpleStringT, (class)(bool)
664 )
665 #else
666 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
667 boost::range_detail_microsoft::atl_string_tag,
668 (ATL, BOOST_PP_NIL), CSimpleStringT, 1
669 )
670 #endif
671
672 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
673 boost::range_detail_microsoft::atl_string_tag,
674 (ATL, BOOST_PP_NIL), CStringT, 2
675 )
676
677 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
678 boost::range_detail_microsoft::atl_string_tag,
679 (ATL, BOOST_PP_NIL), CFixedStringT, (class)(int)
680 )
681
682 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
683 boost::range_detail_microsoft::using_type_as_tag,
684 (ATL, BOOST_PP_NIL), CStaticString, (class)(const int)
685 )
686
687
688#endif // !defined(BOOST_RANGE_ATL_NO_COLLECTIONS)
689
690
691BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TYPE(
692 boost::range_detail_microsoft::using_type_as_tag,
693 (ATL, BOOST_PP_NIL), CComBSTR
694)
695
696
697// simples
698//
699#if !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
700
701 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
702 boost::range_detail_microsoft::using_type_as_tag,
703 (ATL, BOOST_PP_NIL), CSimpleArray, 2
704 )
705
706 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
707 boost::range_detail_microsoft::using_type_as_tag,
708 (ATL, BOOST_PP_NIL), CSimpleMap, 3
709 )
710
711#else
712
713 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
714 boost::range_detail_microsoft::using_type_as_tag,
715 (ATL, BOOST_PP_NIL), CSimpleArray, 1
716 )
717
718 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
719 boost::range_detail_microsoft::using_type_as_tag,
720 (ATL, BOOST_PP_NIL), CSimpleMap, 2
721 )
722
723 BOOST_RANGE_DETAIL_MICROSOFT_CUSTOMIZATION_TEMPLATE(
724 boost::range_detail_microsoft::using_type_as_tag,
725 (ATL, BOOST_PP_NIL), CSimpleValArray, 1
726 )
727
728#endif // !defined(BOOST_RANGE_ATL_HAS_OLD_CSIMPLE_XXX)
729
730
731
732
733#endif