Listing 2
// Listing 2: ChildWindows_range Indirect Range class
class ChildWindows_range
: public stlsoft::indirect_range_tag
{
public:
typedef ChildWindows_range class_type;
typedef HWND value_type;
public:
ChildWindows_range(HWND hwnd)
: m_hwnd(hwnd)
{}
template <typename F>
F for_each(F f);
template <typename T>
size_t count(T const &val) const;
template <typename P>
size_t count_if(P pr) const;
template <typename O>
O copy(O o) const;
ptrdiff_t distance() const
{
struct Internal_
{
static BOOL CALLBACK distance_Proc(HWND , LPARAM lParam)
{
ptrdiff_t &n = *reinterpret_cast<ptrdiff_t*>(lParam);
++n;
return true;
}
};
ptrdiff_t n = 0;
::EnumChildWindows( m_hwnd, Internal_::distance_Proc
, reinterpret_cast<LPARAM>(&n));
return n;
}
HWND max_element() const;
template <typename F>
HWND max_element(F f) const;
HWND min_element() const;
template <typename F>
HWND min_element(F f) const;
private:
HWND m_hwnd;
};