#include <iostream>
#include <string>
#include <vector>
#include <iterator>
namespace internal
{
class PREORDER {};
class POSTORDER {};
// ----------------------------------------------------------------------------------
template<typename P, typename IT>
class my_iterator;
template<typename P>
class my_iterator<P, PREORDER>
: public std::iterator<std::forward_iterator_tag, P>
{
private:
int index;
protected:
public:
my_iterator () { index = 0; }
my_iterator& operator++ () {
std::cout << "Preorder visit of GenericTree of nodes containing int values." << std::endl;
return (*this);
}
};
// ----------------------------------------------------------------------------------
template<typename P>
class my_iterator<P, POSTORDER>
: public std::iterator<std::forward_iterator_tag, P>
{
private:
int index;
protected:
public:
my_iterator () { index = 0; }
my_iterator& operator++ () {
std::cout << "Postorder visit of GenericTree of nodes containing int values." << std::endl;
return (*this);
}
};
}
template<typename P> class GenericTree
{
public:
template <typename IT>
using my_iterator = internal::my_iterator<P, IT>;
using PREORDER = internal::PREORDER;
using POSTORDER = internal::POSTORDER;
std::vector<P> data;
GenericTree () {}
~GenericTree () {}
};
int main ()
{
GenericTree<int> c_int;
GenericTree<int>::my_iterator<GenericTree<int>::PREORDER> iterator_int;
++iterator_int;
GenericTree<std::string> c_string;
GenericTree<std::string>::my_iterator<GenericTree<std::string>::POSTORDER> iterator_str;
++iterator_str;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aXRlcmF0b3I+CgpuYW1lc3BhY2UgaW50ZXJuYWwKewogICAgY2xhc3MgUFJFT1JERVIge307CiAgICBjbGFzcyBQT1NUT1JERVIge307CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgdHlwZW5hbWUgSVQ+CiAgICBjbGFzcyBteV9pdGVyYXRvcjsKCgogICAgdGVtcGxhdGU8dHlwZW5hbWUgUD4KICAgIGNsYXNzIG15X2l0ZXJhdG9yPFAsIFBSRU9SREVSPgogICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBQPgogICAgewogICAgcHJpdmF0ZToKICAgICAgICBpbnQgaW5kZXg7CiAgICBwcm90ZWN0ZWQ6CiAgICBwdWJsaWM6CiAgICAgICAgbXlfaXRlcmF0b3IgKCkgeyBpbmRleCA9IDA7IH0KCiAgICAgICAgbXlfaXRlcmF0b3ImIG9wZXJhdG9yKysgKCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlByZW9yZGVyIHZpc2l0IG9mIEdlbmVyaWNUcmVlIG9mIG5vZGVzIGNvbnRhaW5pbmcgaW50IHZhbHVlcy4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgcmV0dXJuICgqdGhpcyk7CiAgICAgICAgfQogICAgfTsKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+CiAgICBjbGFzcyBteV9pdGVyYXRvcjxQLCBQT1NUT1JERVI+CiAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFA+CiAgICB7CiAgICBwcml2YXRlOgogICAgICAgIGludCBpbmRleDsKICAgIHByb3RlY3RlZDoKICAgIHB1YmxpYzoKICAgICAgICBteV9pdGVyYXRvciAoKSB7IGluZGV4ID0gMDsgfQoKICAgICAgICBteV9pdGVyYXRvciYgb3BlcmF0b3IrKyAoKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiUG9zdG9yZGVyIHZpc2l0IG9mIEdlbmVyaWNUcmVlIG9mIG5vZGVzIGNvbnRhaW5pbmcgaW50IHZhbHVlcy4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgcmV0dXJuICgqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCn0KCnRlbXBsYXRlPHR5cGVuYW1lIFA+IGNsYXNzIEdlbmVyaWNUcmVlCnsKcHVibGljOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIElUPgogICAgdXNpbmcgbXlfaXRlcmF0b3IgPSBpbnRlcm5hbDo6bXlfaXRlcmF0b3I8UCwgSVQ+OwogICAgdXNpbmcgUFJFT1JERVIgPSBpbnRlcm5hbDo6UFJFT1JERVI7CiAgICB1c2luZyBQT1NUT1JERVIgPSBpbnRlcm5hbDo6UE9TVE9SREVSOwoKICAgIHN0ZDo6dmVjdG9yPFA+IGRhdGE7CiAgICBHZW5lcmljVHJlZSAoKSB7fQogICAgfkdlbmVyaWNUcmVlICgpIHt9Cn07CgoKCmludCBtYWluICgpCnsKICAgIEdlbmVyaWNUcmVlPGludD4gY19pbnQ7CiAgICBHZW5lcmljVHJlZTxpbnQ+OjpteV9pdGVyYXRvcjxHZW5lcmljVHJlZTxpbnQ+OjpQUkVPUkRFUj4gaXRlcmF0b3JfaW50OwoKICAgICsraXRlcmF0b3JfaW50OwoKICAgIEdlbmVyaWNUcmVlPHN0ZDo6c3RyaW5nPiBjX3N0cmluZzsKICAgIEdlbmVyaWNUcmVlPHN0ZDo6c3RyaW5nPjo6bXlfaXRlcmF0b3I8R2VuZXJpY1RyZWU8c3RkOjpzdHJpbmc+OjpQT1NUT1JERVI+IGl0ZXJhdG9yX3N0cjsKCiAgICArK2l0ZXJhdG9yX3N0cjsKICAgIHJldHVybiAwOwp9Cg==