#pragma once
// See: boost/range/detail/mfc/cstring.hpp
#if (_ATL_VER >= 0x0700)
#include <cstddef>
#include <atlstr.h>
#include "../range/range_metafunctions_fwd.hpp"
namespace boost {
// range_iterator
template< class BaseT, class TraitsT >
struct range_iterator< ATL::CStringT<BaseT, TraitsT> >
{
typedef typename ATL::CStringT<BaseT, TraitsT>::PXSTR type;
};
template< class BaseT, class TraitsT >
struct range_iterator< ATL::CStringT<BaseT, TraitsT> const > :
range_iterator< ATL::CStringT<BaseT, TraitsT> >
{
};
// range_const_iterator
template< class BaseT, class TraitsT >
struct range_const_iterator< ATL::CStringT<BaseT, TraitsT> >
{
typedef typename ATL::CStringT<BaseT, TraitsT>::PCXSTR type;
};
template< class BaseT, class TraitsT >
struct range_const_iterator< ATL::CStringT<BaseT, TraitsT> const > :
range_const_iterator< ATL::CStringT<BaseT, TraitsT> >
{
};
// range_difference
template< class BaseT, class TraitsT >
struct range_difference< ATL::CStringT<BaseT, TraitsT> >
{
typedef std::ptrdiff_t type;
};
template< class BaseT, class TraitsT >
struct range_difference< ATL::CStringT<BaseT, TraitsT> const > :
range_difference< ATL::CStringT<BaseT, TraitsT> >
{
};
// range_size
template< class BaseT, class TraitsT >
struct range_size< ATL::CStringT<BaseT, TraitsT> >
{
typedef int type;
};
template< class BaseT, class TraitsT >
struct range_size< ATL::CStringT<BaseT, TraitsT> const > :
range_size< ATL::CStringT<BaseT, TraitsT> >
{
};
// range_value
template< class BaseT, class TraitsT >
struct range_value< ATL::CStringT<BaseT, TraitsT> >
{
typedef typename ATL::CStringT<BaseT, TraitsT>::XCHAR type;
};
template< class BaseT, class TraitsT >
struct range_value< ATL::CStringT<BaseT, TraitsT> const > :
range_value< ATL::CStringT<BaseT, TraitsT> >
{
};
// Note: The followings are required because primary templates eat CSimpleStringT's.
// begin
template< class BaseT, class TraitsT >
inline
typename range_iterator< ATL::CStringT<BaseT, TraitsT> >::type
begin(ATL::CStringT<BaseT, TraitsT>& rng)
{
return rng.GetBuffer(0);
}
template< class BaseT, class TraitsT >
inline
typename range_const_iterator< ATL::CStringT<BaseT, TraitsT> >::type
begin(ATL::CStringT<BaseT, TraitsT> const& rng)
{
return rng.GetString();
}
// size
template< class BaseT, class TraitsT >
inline
typename range_size< ATL::CStringT<BaseT, TraitsT> >::type
size(ATL::CStringT<BaseT, TraitsT> const& rng)
{
return rng.GetLength();
}
// end
template< class BaseT, class TraitsT >
inline
typename range_iterator< ATL::CStringT<BaseT, TraitsT> >::type
end(ATL::CStringT<BaseT, TraitsT>& rng)
{
return begin(rng) + size(rng);
}
template< class BaseT, class TraitsT >
inline
typename range_const_iterator< ATL::CStringT<BaseT, TraitsT> >::type
end(ATL::CStringT<BaseT, TraitsT> const& rng)
{
return begin(rng) + size(rng);
}
// default 'empty()' ok
} // namespace boost
#endif // (_ATL_VER >= 0x0700)