Author: | MB |
---|---|

Contact: | mb2act@yahoo.co.jp |

Date: | 26th of May 2006 |

Copyright: | MB 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt). |

Oven Range MFC/ATL Extension provides Boost.Range support for MFC/ATL collection and string types.

CTypedPtrArray<CPtrArray, CList<CString> *> myArray; ... BOOST_FOREACH (CList<CString> *theList, myArray) { BOOST_FOREACH (CString& str, *theList) { boost::to_upper(str); std::sort(boost::begin(str), boost::end(str)); ... } }

- Boost C++ Libraries Version 1.33.1 or later (no compilation required)
- P-Stade C++ Libraries Version 1.02.0 or later (no compilation required, give a higher priority than Boost headers)

- Microsoft Visual C++ .NET Version 7.1 SP1
- Microsoft Visual C++ 2005 Express Edition

If the `<pstade/oven/mfc.hpp>` is included before or after Boost.Range headers,
the MFC collections and strings become models of Range.
The table below lists the Traversal Category and `range_reference` of MFC ranges.

Range |
Traversal Category | range_reference<Range>::type |
---|---|---|

CArray<T,A> |
Random Access | T& |

CList<T,A> |
Bidirectional | T& |

CMap<K,AK,M,AM> |
Forward | Range::CPair& |

CTypedPtrArray<B,T*> |
Random Access | T* const |

CTypedPtrList<B,T*> |
Bidirectional | T* const |

CTypedPtrMap<B,T*,V*> |
Forward | std::pair<T*,V*> const |

CByteArray |
Random Access | BYTE& |

CDWordArray |
Random Access | DWORD& |

CObArray |
Random Access | CObject* & |

CPtrArray |
Random Access | void* & |

CStringArray |
Random Access | CString& |

CUIntArray |
Random Access | UINT& |

CWordArray |
Random Access | WORD& |

CObList |
Bidirectional | CObject* & |

CPtrList |
Bidirectional | void* & |

CStringList |
Bidirectional | CString& |

CMapPtrToWord |
Forward | std::pair<void*,WORD> const |

CMapPtrToPtr |
Forward | std::pair<void*,void*> const |

CMapStringToOb |
Forward | std::pair<String,CObject*> const |

CMapStringToString |
Forward | Range::CPair& |

CMapWordToOb |
Forward | std::pair<WORD,CObject*> const |

CMapWordToPtr |
Forward | std::pair<WORD,void*> const |

Other Boost.Range metafunctions are defined by the following.
Let `Range` be any type listed above and `ReF` be the same as `range_reference<Range>::type`.
`range_value<Range>::type` is the same as `remove_reference<remove_const<Ref>::type>::type`,
`range_difference<Range>::type` is the same as `std::ptrdiff_t`, and
`range_pointer<Range>::type` is the same as `add_pointer<remove_reference<Ref>::type>::type`.
As for `const Range`, see const Ranges.

If the `<pstade/oven/atl.hpp>` is included before or after Boost.Range headers,
the ATL collections and strings become models of Range.
The table below lists the Traversal Category and `range_reference` of ATL ranges.

Range |
Traversal Category | range_reference<Range>::type |
---|---|---|

CAtlArray<E,ET> |
Random Access | E& |

CAutoPtrArray<E> |
Random Access | E& |

CInterfaceArray<I,pi> |
Random Access | CComQIPtr<I,pi>& |

CAtlList<E,ET> |
Bidirectional | E& |

CAutoPtrList<E> |
Bidirectional | E& |

CHeapPtrList<E,A> |
Bidirectional | E& |

CInterfaceList<I,pi> |
Bidirectional | CComQIPtr<I,pi>& |

CAtlMap<K,V,KT,VT> |
Forward | Range::CPair& |

CRBTree<K,V,KT,VT> |
Bidirectional | Range::CPair& |

CRBMap<K,V,KT,VT> |
Bidirectional | Range::CPair& |

CRBMultiMap<K,V,KT,VT> |
Bidirectional | Range::CPair& |

CSimpleStringT<B,b> |
Random Access | B& |

CStringT<B,ST> |
Random Access | B& |

CFixedStringT<S,n> |
Random Access | range_reference<S>::type |

CStringT<B,ST> |
Random Access | B& |

CComBSTR |
Random Access | OLECHAR& |

CSimpleArray<T,TE> |
Random Access | T& |

Other Boost.Range metafunctions are defined by the following.
Let `Range` be any type listed above and `ReF` be the same as `range_reference<Range>::type`.
`range_value<Range>::type` is the same as `remove_reference<Ref>::type`,
`range_difference<Range>::type` is the same as `std::ptrdiff_t`, and
`range_pointer<Range>::type` is the same as `add_pointer<remove_reference<Ref>::type>::type`.
As for `const Range`, see const Ranges.

`range_reference<const Range>::type` is defined by the following algorithm.
Let `Range` be any type listed above and `ReF` be the same as `range_reference<Range>::type`.

if (Range is CObArray || Range is CObList) return CObject const * & else if (Range is CPtrArray || Range is CPtrList) return void const * & else if (there is a type X such that X& is the same as ReF) return X const & else if (there is a type X such that X* const is the same as ReF) return X const * const else return ReF

Other Boost.Range metafunctions are defined by the following.
`range_value<const Range>::type` is the same as `range_value<Range>::type`,
`range_difference<const Range>::type` is the same as `std::ptrdiff_t`, and
`range_pointer<const Range>::type` is the same as `add_pointer<remove_reference<range_reference<const Range>::type>::type>::type`.