#!/usr/bin/perl
use strict;
use warnings;
use stl;

print ">>>$0>>>>:\n";
my $v = list(element_type => 'MyElem', qw(first second third fourth fifth));
for_each($v->begin(), $v->end(), ptr_fun('::myprint'));

print 'for_each($v->begin(), $v->end(), ptr_fun(\'uc\'));', "\n";
for_each($v->begin(), $v->end(), ptr_fun('uc'));
for_each($v->begin(), $v->end(), ptr_fun('::myprint'));

print 'for_each($v->begin(), $v->end(), "something");', "\n";
for_each($v->begin(), $v->end(), mem_fun('something'));

print "Static Foreach with unary-function-object:\n";
for_each($v->begin(), $v->end(), ptr_fun('::myprint'));

my $v2 = list(element_type => 'MyElem', qw(red blue green yellow white));
my $t1 = tree($v);
my $t2 = tree($v2);
my $tree = tree();
print "\$tree->size()=", $tree->size(), "\n";
$tree->push_back($tree->factory($t1));
$tree->push_back($tree->factory($t2));

print "Tree Foreach:\n";
for_each($tree->begin(), $tree->end(), ptr_fun('::myprint'));

print "Tree Find_If 'yellow':",
	find_if($tree->begin(), $tree->end(), bind1st(equal_to(), 'yellow'))
	? '...Found' : '...Not found!', "\n";

print "Tree Count_If(/e/i):",
	count_if($tree->begin(), $tree->end(), bind2nd(matches_ic(), 'e')),
	"\n";

print "Tree Remove_If(/l/i):\n";
remove_if($tree->begin(), $tree->end(), bind2nd(matches_ic(), 'l'));
for_each($tree->begin(), $tree->end(), ptr_fun('::myprint'));

print "Tree Find_If 'yellow':",
	find_if($tree->begin(), $tree->end(), bind1st(equal_to(), 'yellow'))
	? '...Found' : '...Not found!', "\n";

sub myprint { print "Data:", @_, "\n"; }
# ----------------------------------------------------------------------------------------------------
{
	package MyElem;
	use base qw(Class::STL::Element);
	sub something
	{
		my $self = shift;
		print "Something:", $self->data(), "\n";
	}
}
# ----------------------------------------------------------------------------------------------------
