imgtools/imglib/boostlibrary/boost/range/atl.hpp
changeset 0 044383f39525
equal deleted inserted replaced
-1:000000000000 0:044383f39525
       
     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 
       
    54 namespace 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 
       
   180 namespace 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 
       
   225 namespace 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 
       
   691 BOOST_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