NAME
Class::STL::Containers - Perl extension for STL-like object management
SYNOPSIS
use stl;
# Deque container...
my $d = stl::deque(qw(first second third fourth));
$d->push_back($d->factory('fifth'));
$d->push_front($d->factory('seventh'));
$d->pop_front(); # remove element at front.
$d->pop_back(); # remove element at back.
stl::for_each($d->begin(), $d->end(), ptr_fun('::myprint'));
sub myprint { print "Data:", @_, "\n"; }
# Copy constructor...
my $d_copy = stl::deque($d);
# Algorithms -- find_if()
print "Element 'second' was ",
stl::find_if($d->begin(), $d->end(), stl::bind1st(stl::equal_to(), 'second'))
? 'found' : 'not found', "\n";
# Algorithms -- count_if()
print "Number of elements matching /o/ = ",
stl::count_if($d->begin(), $d->end(), stl::bind2nd(stl::matches(), 'o')),
"\n"; # prints '2' -- matches 'second' and 'fourth'
# Algorithms -- transform()
stl::transform($d->begin(), $d->end(), $d2->begin(), stl::ptr_fun('ucfirst'));
stl::transform($d->begin(), $d->end(), $d2->begin(), $d3->begin(), stl::ptr_fun_binary('::mybfun'));
sub mybfun { return $_[0] . '-' . $_[1]; }
# Function Adaptors -- bind1st
stl::remove_if($v->begin(), $v->end(), stl::bind1st(stl::equal_to(), $v->back()));
# remove element equal to back() -- ie remove last element.
stl::remove_if($v->begin(), $v->end(), stl::bind2nd(stl::matches(), '^fi'));
# remove all elements that match reg-ex '^fi'
# Sort list according to elements cmp() function
$v->sort();
# Queue containers -- FIFO
my $v = stl::queue(qw(first second third fourth fifth));
print 'Back:', $v->back()->data(), "\n" # Back:fifth
print 'Front:', $v->front()->data(), "\n" # Front:first
$v->pop(); # pop element first in
$v->push($v->factory('sixth')), "\n"
print 'Back:', $v->back()->data(), "\n" # Back:sixth
print 'Front:', $v->front()->data(), "\n" # Front:second
# Iterators
for (my $i = $v->begin(); !$i->at_end(); ++$i)
{
print "Data:", $i->p_element()->data();
}
# Iterators -- reverse_iterator
my $ri = stl::reverse_iterator($v->iter())->first();
while (!$ri->at_end())
{
print "Data:", $ri->p_element()->data();
++$ri;
}
# Inserters
my $three2one = stl::list(qw(3 2 1));
my $four2six = stl::list(qw(4 5 6));
my $seven2nine = stl::list(qw(7 8 9));
my $result = stl::list();
stl::copy($three2one->begin(), $three2one->end(), stl::front_inserter($result));
stl::copy($seven2nine->begin(), $seven2nine->end(), stl::back_inserter($result));
my $iseven = stl::find($result->begin(), $result->end(), 7);
stl::copy($four2six->begin(), $four2six->end(), stl::inserter($result, $iseven));
# $result now contains (1, 2, 3, 4, 5, 6, 7, 8, 9);
# Vector container...
my $v = stl::vector(qw(first second third fourth fifth));
my $e = $v->at(0); # return pointer to first element.
print 'Element-0:', $e->data(), "\n"; # Element-0:first
$e = $v->at($v->size()-1); # return pointer to last element.
print 'Element-last:', $e->data(), "\n"; # Element-last:fifth
$e = $v->at(2); # return pointer to 3rd element (idx=2).
print 'Element-2:', $e->data(), "\n"; # Element-2:third
# Priority Queue
my $p = stl::priority_queue();
$p->push($p->factory(priority => 10, data => 'ten'));
$p->push($p->factory(priority => 2, data => 'two'));
$p->push($p->factory(priority => 12, data => 'twelve'));
$p->push($p->factory(priority => 3, data => 'three'));
$p->push($p->factory(priority => 11, data => 'eleven'));
$p->push($p->factory(priority => 1, data => 'one'));
$p->push($p->factory(priority => 1, data => 'one-2'));
$p->push($p->factory(priority => 12, data => 'twelve-2'));
$p->push($p->factory(priority => 20, data => 'twenty'), $p->factory(priority => 0, data => 'zero'));
print "\$p->size()=", $p->size(), "\n";
print "\$p->top():", $p->top(), "\n";
$p->top()->priority(7); # change priority for top element.
$p->refresh(); # refresh required after priority change.
$p->pop(); # remove element with highest priority.
print "\$p->top():", $p->top(), "\n";
# Clone $d container into $d1...
my $d1 = $d->clone();
my $d2 = stl::deque(qw(sixth seventh eight));
# Append $d container to end of $d2 container...
$d2 += $d;
# DataMembers -- Class builder helper...
{
package MyClass;
use Class::STL::ClassMembers (
qw(attrib1 attrib2), # data members
Class::STL::ClassMembers::DataMember->new(
name => 'attrib3', default => '100', validate => '^\d+$'), # data member with attributes
Class::STL::ClassMembers::DataMember->new(
name => 'attrib4', default => 'med', validate => '^(high|med|low)$'),
);
use Class::STL::ClassMembers::Constructor; # produce class new() function
}
my $cl = MyClass->new(attrib1 => 'hello', attrib2 => 'world');
print $cl->attrib1(), " ", $cl->attrib2(), "\n"; # 'hello world'
$cl->attrib1(ucfirst($cl->attrib1));
$cl->attrib2(ucfirst($cl->attrib2));
print $cl->attrib1(), " ", $cl->attrib2(), "\n"; # 'Hello World'
$cl->attrib4('avg'); # Causes progam to die with '** Function attrib2 value failed validation...'
DESCRIPTION
This package provides a framework for rapid Object Oriented Perl application development. It consists of a number of base classes that are similar to the C++/STL framework, plus a number of helper classes which provide the glue to transparently generate common functions, and will enable you to put your Perl application together very quickly.
The STL functionality provided consists of containers, algorithms, utilities and iterators as follows:
- Containers
-
vector, list, deque, queue, priority_queue, stack, tree.
- Iterators
-
iterator, bidirectional_iterator, reverse_iterator, forward_iterator.
- Algorithms
-
find, find_if, for_each, transform, count, count_if, copy, copy_backward, remove, remove_if, remove_copy, remove_copy_if, replace, replace_if, replace_copy, replace_copy_if.
- Utilities
-
equal_to, not_equal_to, greater, greater_equal, less, less_equal, compare, bind1st, bind2nd, mem_fun, ptr_fun, ptr_fun_binary, matches, matches_ic, logical_and, logical_or, multiplies, divides, plus, minus, modulus.
Differences From C++/STL
Most of the functions have the same arguments and return types as their STL equivalent. There are some differences though between the C++/STL and this implementation:
- Iterators and the end() function
-
An iterator object points to a numeric position within the container, and not to an element. If new elements are inserted to, or removed from, a postion preceding the iterator, then the iterator will point to the same position but to a different element.
The end function will return a newly constructed iterator object which will point to the last element within the container, unlike the C++/STL equivalent which points to after the last element.
- The tree Container
-
This container provides a hierarchical tree structure. Each element within a tree container can be either a simple element or another container object. The algorithms and overridden to_array functions will traverse the tree and pocess all element nodes within the tree.
- Utilities matches, matches_ic functions
-
These utilities provide unary functions for regular expression matching. The first or second argument will be a regular expression string. The match_ic provides case insensitive matching.
- Container append function
-
This function and the overridden
+
,+=
operators will combine the two containers together. - The clone function
-
This function returns a newly constructed object that is a copy of its caller object.
- The Container to_array function
-
This function will return an array consisting of all element objects within the container.
- Container element type
-
All containers contain collections of objects which are of type Class::STL::Element, or classes derived from this type. The container classes are themselves, ultimately, derived from this element type.
CLASS Class::STL::ClassMembers
These helper classes can be used to generate code for various basic class functions. This module requires an import list consisting of target data member names or Class::STL::ClassMembers::DataMember objects. When using ClassMembers ALL data members should be included in order for the generated clone and swap functions to function correctly. The constructor function code can be produces as well by using the package Class::STL::ClassMembers::Constructor, or Class::STL::ClassMembers::SingletonConstructor to create a singleton class type.
The following target member functions will be generated and made available to the class:
- Data Member Accessor Get/Put Function
-
This function will have the same name as the data member and should be used to set or get the value for the data member. Pass the value as the argument when setting the value for a data member. For comlpex data members with a validate attribute, a validation check will be performed when attempting to set the member value by matching the value against the validate regular expression string.
- Class members_init() Function
-
This function should be called in the target class's new function after $self has been blessed. It will perform the necessary data members initialisation.
- Class clone() Function
-
This function will construct and return an object containing a copy of the caller object.
- Class swap() Function
-
This function requires one argument consisting of an object of the same type as the caller. It will swap the caller object with this other object.
- Class members() Function
-
This function will return a pointer to an anonymous hash containing the data member names (as the key) and data member attibutes array list consisting of default and validate attribute fields in that order. All data members, including inherited members are contained in this hash.
- Class members_local() Function
-
Same as members function except that only the data members local to the class are contained in the hash returned.
- Class::STL::ClassMembers::DataMember
-
For more complex data members, this class may be used to provide additional information about the member. This information consist of: name, default, and validate. The name attribute contains the member name; the default attribute contains a default value for the member when initialised; the validate attribute consists of a regular expression string that will be used to validate the member value by matching it to this regex string.
- Class::STL::ClassMembers::Constructor
-
The constructor function with the name new() will be produced for a package that uses this module. It is recomended that this constructor is produced for any class (package) that uses the ClassMembers package to produce the data members. This will ensure that the correct calls are done during construction and copy-construction of an object. This constructor will make a call to the
static
user member function new_extra if it exists in the calling class. The new_extra function will have the object reference passed as the first argument. - Class::STL::ClassMembers::SingletonConstructor
-
Use this package to produce a singleton class. This constructor will ensure that only one instance of this class will be constructed.
Example
{
package MyClass;
use Class::STL::ClassMembers (
qw(attrib1 attrib2),
Class::STL::ClassMembers::DataMember->new(
name => 'attrib3', default => '100', validate => '^\d+$'),
Class::STL::ClassMembers::DataMember->new(
name => 'attrib4', default => 'med', validate => '^(high|med|low)$'),
);
use Class::STL::ClassMembers::Constructor; # produce class new() function
}
my $cl = MyClass->new(attrib1 => 'hello', attrib2 => 'world');
print $cl->attrib1(), " ", $cl->attrib2(), "\n"; # 'hello world'
$cl->attrib1(ucfirst($cl->attrib1));
$cl->attrib2(ucfirst($cl->attrib2));
print $cl->attrib1(), " ", $cl->attrib2(), "\n"; # 'Hello World'
$cl->attrib4('avg'); # Causes progam to die with '** Function attrib2 value failed validation...'
CLASS Class::STL::Containers
Exports
vector, list, deque, queue, priority_queue, stack, tree.
CLASS Class::STL::Containers::Abstract
This is the abstract base class for all other container classes. Objects should not be constructed directly from this class, but from any of the derived container classes. Common functions are documented here.
Extends Class::STL::Element
- new
-
container-ref new ( [ named-argument-list ] );
container-ref new ( container-ref );
container-ref new ( element [, ...] );
container-ref new ( iterator-start [, iterator-finish ] );
container-ref new ( raw-data [, ... ] );
The new function constructs an object for this class and returns a blessed reference to this object. All forms accept an optional hash containing any of the following named arguments: element_type. The element_type defines the class type of element objects that the container will hold. element_type will default to Class::STL::Element if not specified; when specified, the type must be derived from Class::STL::Element.
The second form is a copy constructor. It requires another container reference as the argument, and will return a copy of this container.
The third form requires one or more element refs as arguments. These elements will be copied into the newly constructed container.
The fourth form requires one start iterator and an optional finish iterator. All the element objects with, and including, the start and finish (or end if not specified) positions will be copied into the newly constructed container.
The fifth form accepts a list of raw data values. Each of these values will be stored inside a Class::STL::Element object constructed by the container's factory function, with the element's data member containing the raw data value.
- clone
-
Returns a newly constructed object which is identical to the calling (this) object.
- factory
-
element-ref factory ( %attributes );
The factory function constructs a new element object and returns a reference to this. The type of object created is as specified by the element_type container attribute. The attributes argument consists of a hash and is passed on to the element class new function. Override this function if you want to avoid the 'eval' call.
- erase
-
iterator erase ( iterator-start [, iterator-finish ] );
The erase function requires one starting iterator and an optional finish iterator as arguments. It will delete all the elements in the container within, and including, these two iterator positions. The erase funtion returns and iterator pointing to the element following the last deleted element.
- insert
-
void insert ( position, iterator-start, iterator-finish );
void insert ( position, iterator-start );
void insert ( position, element [, ...] );
void insert ( position, size, element );
The first form will insert copies of elements within the iterator-start and iterator-finish positions before position.
The second form will insert copies of elements within the iterator-start and end positions before position
The third form will insert the element, or elements (not copies) before position.
The fourth form will insert size copies of element before position.
- pop
-
void pop ( );
The pop function requires no arguments. It will remove the element at the top of the container.
- push
-
void push ( element [, ...] );
The push function requires one or more arguments consisting of elements. This will append the element(s) to the end of the container.
- clear
-
void clear ( );
This function will delete all the elements from the container.
- begin
-
iterator-ref begin ( );
The begin function constructs and returns a new iterator object which points to the front element within the container.
- end
-
iterator-ref end ( );
The end function constructs and returns a new iterator object which points to the back element within the container. **Note that, unlike C++/STL, this object points to the last element and not after the last element.
- rbegin
-
iterator-ref rbegin ( );
The rbegin function is the reverse of the begin function -- the newly constructed iterator points to the last element.
- rend
-
iterator-ref rend ( );
The rend function is the reverse of the end function -- the newly constructed iterator points to the first element.
- size
-
int size ( );
The size function requires no arguments. It will return an integer value containing the number of elements in the container.
- empty
-
bool empty ( );
This function returns '1' if the container is empty (ie. contains no elements), and '0' if the container contains one or more elements.
- to_array
-
array to_array ( );
The to_array function returns an array containing the elements (references) from the container.
- eq
-
bool eq ( container-ref );
The eq function compares the elements in this container with the elements in the container refered to by the argument container-ref. The elements are compared using the element eq function. The function will return '1' if both containers contain the same number of elements and all elements in one container are equal to, and in the same order as, all elements in the container-ref container.
- ne
-
bool ne ( container-ref );
Inverse of eq function.
- operator +, operator +=
-
Append containers.
- operator ==
-
Containers equality comparison.
- operator !=
-
Containers non-equality comparison.
CLASS Class::STL::Containers::List
A list container can have elements pushed and popped from both ends, and also inserted at any location. Access to the elements is sequential.
Extends Class::STL::Containers::Deque
- reverse
-
void reverse ( );
The reverse function will alter the order of the elements in list by reversing their order.
- sort
-
void sort ( );
The sort function will alter the order of the elements in list by sorting the elements. Sorting is done based on the elements cmp comparison function.
Example
use stl;
# Construct the list object:
my $list = list(qw( first second third fourth fifth));
# Display the number of elements in the list:
print "Size:", $list->size(), "\n"; # Size:5
# Reverse the order of elements in the list:
$list->reverse();
# Display the contents of the element at the front of the list:
print 'Front:', $list->front(), "\n";
# Display the contents of the element at the back of the list:
print 'Back:', $list->back(), "\n";
# Display the contents of all the elements in the list:
for_each($list->begin(), $list->end(), MyPrint->new());
# Return an array of all elements-refs:
my @arr = $l1->to_array();
# Delete all elements from list:
$list->clear();
print "Size:", $list->size(), "\n"; # Size:0
print '$list container is ',
$list->empty() ? 'empty' : 'not empty', "\n";
# MyPrint Unary Function -- used in for_each() above...
{
package MyPrint;
use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
sub function_operator
{
my $self = shift;
my $arg = shift;
print "Data:", $arg->data(), "\n";
}
}
CLASS Class::STL::Containers::Vector
A vector allows for random access to its elements via the at function.
Extends Class::STL::Containers::Abstract
- push_back
-
void push_back ( element [, ...] );
The push_back function requires one or more arguments consisting of elements. This will append the element(s) to the end of the vector.
- pop_back
-
void pop_back ( );
The pop_back function requires no arguments. It will remove the element at the top of the vector.
- back
-
element-ref back ( );
The back function requires no arguments. It returns a reference to the element at the back of the vector.
- front
-
The front function requires no arguments. It returns a reference to the element at the front of the vector.
- at
-
element-ref at ( index );
The at function requires an index argument. This function will return a reference to the element at the location within the vector specified by the argument index.
CLASS Class::STL::Containers::Deque
A double-ended container. Elements can be pushed and popped at both ends.
Extends Class::STL::Containers::Vector
- push_front
-
void push_front ( element [, ...] );
The push_front function requires one or more arguments consisting of elements. This will insert the element(s) to the front of the deque.
- pop_front
-
void pop_front ( );
The pop_front function requires no arguments. It will remove the element at the front of the deque.
CLASS Class::STL::Containers::Queue
A queue is a FIFO (first-in-first-out) container. Elements can be pushed at the back and popped from the front.
Extends Class::STL::Containers::Abstract
- push
-
void push ( element [, ...] );
The push function requires one or more arguments consisting of elements. This will append the element(s) to the back of the queue.
- pop
-
void pop ( );
The pop function requires no arguments. It will remove the element at the front of the queue. This is the earliest inserted element.
- back
-
element-ref back ( );
The back function requires no arguments. It returns a reference to the element at the back of the queue. This is the element last inserted.
- front
-
element-ref front ( );
The front function requires no arguments. It returns a reference to the element at the front of the queue. This is the earliest inserted element.
CLASS Class::STL::Containers::Stack
A stack is a LIFO (last-in-first-out) container. Elements can be pushed at the top and popped from the top.
Extends Class::STL::Containers::Abstract
- push
-
void push ( element [, ...] );
The push function requires one or more arguments consisting of elements. This will append the element(s) to the top of the stack.
- pop
-
void pop ( );
The pop function requires no arguments. It will remove the element at the top of the stack. This is the last inserted element.
- top
-
element-ref top ( );
The top function requires no arguments. It returns a reference to the element at the top of the stack. This is the last inserted element.
CLASS Class::STL::Containers::Tree
A tree is a hierarchical structure. Each element within a tree container can be either a simple element or another container object. The overridden to_array function will traverse the tree and return an array consisting of all the nodes in the tree.
Extends Class::STL::Containers::Deque
- to_array
-
array to_array ( );
The overridden to_array function will traverse the tree and return an array consisting of all the element nodes in the tree container.
Examples
# Tree containers; construct two trees from
# previously construced containers:
my $t1 = tree($l1);
my $t2 = tree($l2);
# Construct a third tree:
my $tree = tree();
# Add other tree containers as elements to this tree:
$tree->push_back($tree->factory($t1));
$tree->push_back($tree->factory($t2));
# Search for element ('pink') in tree:
if (my $f = find_if($tree->begin(), $tree->end(), bind1st(equal_to(), 'pink'))
print "FOUND:", $f->data(), "\n";
} else {
print "'pink' NOT FOUND", "\n";
}
# Traverse tree returning all element nodes:
my @tarr = $tree->to_array();
CLASS Class::STL::Containers::PriorityQueue
A priority queue will maintain the order of the elements based on their priority, with highest priority elements at the top of the container. Elements contained in a priority queue must be of the type, or derived from, Class::STL::Element::Priority. This element type contains the attribute priority, and needs to have its value set whenever an object of this element type is constructed.
Extends Class::STL::Containers::Vector
Element Type Class::STL::Element::Priority
- push
-
void push ( element [, ...] );
The push function requires one or more arguments consisting of elements. This will place the element(s) in the queue according to their priority value.
- pop
-
void pop_back ( );
The pop function requires no arguments. It will remove the element with the highest priority.
- top
-
element-ref top ( );
The top function requires no arguments. It returns a reference to the element with the highest priority.
- refresh
-
void refresh ( );
The refresh function should be called whenever the priority value for an element has been order. This will update the ordering of the elements if required.
CLASS Class::STL::Algorithms
This module contains various algorithm functions.
Exports
remove_if, find_if, for_each, transform, count_if, find, count, copy, copy_backward, remove, remove_copy, remove_copy_if, replace, replace_if, replace_copy, replace_copy_if, generate, generate_n, fill, fill_n, equal, reverse, reverse_copy, rotate, rotate_copy, partition, stable_partition, min_element, max_element, unique, unique_copy, adjacent_find
The Algorithms package consists of various static algorithm functions.
The unary-function / binary-function argument must be derived from Class::STL::Utilities::FunctionObject::UnaryFunction and Class::STL::Utilities::FunctionObject::BinaryFunction respectively. Standard utility functions are provided in the Class::STL::Utilities module. A function object contains the function function_operator. This function_operator function will, in turn, be called by the algorithm for each element traversed. The algorithm will pass the element reference as the argument to the function_operator function.
- for_each
-
void for_each ( iterator-start, iterator-finish, unary-function );
The for_each function will traverse the container starting from iterator-start and ending at iterator-finish and execute the unary-function with the element passed in as the argument.
- transform
-
void transform ( iterator-start, iterator-finish, iterator-result, unary-function );
void transform ( iterator-start, iterator-finish, iterator-start2, iterator-result, binary-function );
The transform functions has two forms. The first form will traverse the container starting from iterator-start and ending at iterator-finish and execute the unary-function with the element passed in as the argument, producing iterator-result.
The second form will traverse two containers with the second one starting from iterator-start2. The binary-function will be called for each pair of elements. The resulting elements will be placed in iterator-result.
- count
-
int count ( iterator-start, iterator-finish, element-ref );
- count_if
-
int count_if ( iterator-start, iterator-finish, unary-function );
The count_if function will traverse the container starting from iterator-start and ending at iterator-finish and return a count of the elements that evaluate to true by the unary-function.
- find
-
iterator-ref find ( iterator-start, iterator-finish, element-ref );
- find_if
-
iterator-ref find_if ( iterator-start, iterator-finish, unary-function );
The find_if function will traverse the container starting from iterator-start and ending at iterator-finish and return an iterator pointing to the first element that evaluate to true by the unary-function. If no elements evaluates to true then 'o' is returned.
- copy
-
void copy ( iterator-start, iterator-finish, iterator-result );
- copy_backward
-
void copy_backward ( iterator-start, iterator-finish, iterator-result );
- remove
-
void remove ( iterator-start, iterator-finish, element-ref );
- remove_if
-
void remove_if ( iterator-start, iterator-finish, unary-function );
The remove_if function will traverse the container starting from iterator-start and ending at iterator-finish and remove the elements that evaluate to true by the unary-function.
- remove_copy
-
void remove_copy ( iterator-start, iterator-finish, iterator-result, element-ref );
- remove_copy_if
-
void remove_copy_if ( iterator-start, iterator-finish, iterator-result, unary-function );
- replace
-
void replace ( iterator-start, iterator-finish, old-element-ref, new-element-ref );
- replace_if
-
void replace_if ( iterator-start, iterator-finish, unary-function, new-element-ref );
- replace_copy
-
void replace_copy ( iterator-start, iterator-finish, iterator-result, old-element-ref, new-element-ref );
- replace_copy_if
-
void replace_copy_if ( iterator-start, iterator-finish, iterator-result, unary-function, new-element-ref );
- generate
-
void generate ( iterator-start, iterator-finish, generator-function );
- generate_n
-
void generate_n ( iterator-start, size, generator-function );
- fill
-
void fill ( iterator-start, iterator-finish, element-ref );
- fill_n
-
void fill_n ( iterator-start, size, element-ref );
- equal
-
bool equal ( iterator-start, iterator-finish, iterator-result [, binary-function ] );
- reverse
-
void reverse ( iterator-start, iterator-finish );
- reverse_copy
-
void reverse_copy ( iterator-start, iterator-finish, iterator-result );
- rotate
-
void rotate ( iterator-start, iterator-mid, iterator-finish );
- rotate_copy
-
void rotate_copy ( iterator-start, iterator-mid, iterator-finish, iterator-result );
- partition
-
void partition ( iterator-start, iterator-finish, [, unary-predicate ] );
- stable_partition
-
void stable_partition ( iterator-start, iterator-finish, [, unary-predicate ] );
- min_element
-
iterator min_element ( iterator-start, iterator-mid [, binary-function ] );
- max_element
-
iterator max_element ( iterator-start, iterator-mid [, binary-function ] );
- unique
-
iterator unique ( iterator-start, iterator-finish, [, binary-function ] );
- unique_copy
-
iterator unique_copy ( iterator-start, iterator-finish, iterator-result [, binary-function ] );
- adjacent_find
-
iterator ajacent_find ( iterator-start, iterator-finish, [, binary-predicate ] );
Examples
use Class::STL::Containers;
use Class::STL::Algorithms;
use Class::STL::Utilities;
# Display all elements in list container '$list'
# using unary-function 'myprint' and algorithm 'for_each':
for_each($list->begin(), $list->end(), ptr_fun('::myprint'));
sub myprint { print "Data:", @_, "\n"; }
# Algorithms -- remove_if()
# Remove element equal to back() -- ie remove last element:
remove_if($list->begin(), $list->end(), bind1st(equal_to(), $list->back()));
# Remove all elements that match regular expression '^fi':
remove_if($v->begin(), $v->end(), bind2nd(matches(), '^fi'));
# Search for element ('pink') in tree:
if (my $f = $tree->find_if($tree->begin(), $tree->end(), bind1st(equal_to(), "pink"))) {
print "FOUND:", $f->p_element()->data(), "\n";
} else {
print "'pink' NOT FOUND", "\n";
}
CLASS Class::STL::Utilities
Exports
equal_to, not_equal_to, greater, greater_equal, less, less_equal, compare, bind1st, bind2nd, mem_fun, ptr_fun, ptr_fun_binary, matches, matches_ic, logical_and, logical_or, multiplies, divides, plus, minus, modulus.
This module contains various utility function objects. Each object will be constructed automatically when the function name (eg. 'equal_to') is used. Each of the function objects are derived from either Class::STL::Utilities::FunctionObject::UnaryFunction or Class::STL::Utilities::FunctionObject::BinaryFunction.
- equal_to
-
Binary predicate. This function-object will return the result of equality between its argument and the object arg attribute's value. The element's eq function is used for the comparison.
- not_equal_to
-
Binary predicate. This function is the inverse of equal_to.
- greater
-
Binary predicate. This function-object will return the result of greater-than comparison between its argument and the object arg attribute's value. The element's gt function is used for the comparison.
- greater_equal
-
Binary predicate. This function-object will return the result of greater-than-or-equal comparison between its argument and the object arg attribute's value. The element's ge function is used for the comparison.
- less
-
Binary predicate. This function-object will return the result of less-than comparison between its argument and the object arg attribute's value. The element's lt function is used for the comparison.
- less_equal
-
Binary predicate. This function-object will return the result of less-than-or-equal comparison between its argument and the object arg attribute's value. The element's le function is used for the comparison.
- compare
-
Binary predicate. This function-object will return the result of compare comparison between its argument and the object arg attribute's value. The element's cmp function is used for the comparison.
- matches
-
Binary predicate. This function-object will return the result (true or false) of the regular expression comparison between its first argument and its second argument which contains a regular expression string.
- matches_ic
-
Binary predicate. Case-insensitive version of the matches function.
- bind1st
-
Unary function. This function requires two arguments consisting of a binary-function-object and a element or value argument. It will produce a unary-function object whose function_operator member will call the binary-function with argument as the first argument.
- bind2nd
-
Unary function. This function requires two arguments consisting of a binary-function-object and a element or value argument. It will produce a unary-function object whose function_operator member will call the binary-function with argument as the second argument.
- mem_fun
-
This function requires one argument consisting of the class member function name (string). It will construct an object whose function_operator member will require an element object to be passed as the first argument. It will call the elements's member function as specified by the mem_fun argument.
- ptr_fun
-
Unary function. This function requires one argument consisting of a global function name (string).
- ptr_fun_binary
-
Binary function. This function requires one argument consisting of global function name (string).
- logical_and
-
Binary predicate.
- logical_or
-
Binary predicate.
- multiplies
-
Binary function. This function-object will return the result of multiply between its two element arguments. The element's mult function is used for the calculation. It will return a newly construced element object containing the result.
- divides
-
Binary function. This function-object will return the result of division between its two element arguments. The element's div function is used for the calculation. It will return a newly construced element object containing the result.
- plus
-
Binary function. This function-object will return the result of plus between its two element arguments. The element's add function is used for the calculation. It will return a newly construced element object containing the result.
- minus
-
Binary function. This function-object will return the result of subtract between its two element arguments. The element's subtract function is used for the calculation. It will return a newly construced element object containing the result.
- modulus.
-
Binary function. This function-object will return the result of modulus between its two element arguments. The element's mod function is used for the calculation. It will return a newly construced element object containing the result.
CLASS Class::STL::Iterators
This module contains the iterator classes.
Exports
iterator, bidirectional_iterator, reverse_iterator, forward_iterator, ++, --, ==, !=, >=, <=, +, +=, -, -=, distance, advance, front_inserter, back_inserter, inserter.
- new
- p_container
-
Returns a reference to the container that is associated with the iterator.
- p_element
-
This function will return a reference to the element pointed to by the iterator.
- distance
-
Static function. This function will return the distance between two iterators. Both iterators must be from the same container. Iterator-finish must be positioned after iterator-first.
int distance ( iterator-start, iterator-finish ] );
- advance
-
Static function. Moves the iterator forward, or backwards if size is negative.
iterator advance ( iterator, size );
- inserter
-
Static function.
iterator inserter ( container, iterator );
- front_inserter
-
Static function.
iterator front_inserter ( container );
- back_inserter
-
Static function.
iterator back_inserter ( container );
- first
- next
- last
- prev
- at_end
- eq
- ne
- lt
- le
- gt
- ge
- cmp
Examples
# Using overoaded inrement operator:
for (my $i = $p->begin(); !$i->at_end(); $i++)
{
MyPrint->new()->function_operator($i->p_element());
}
# Using overoaded decrement operator:
for (my $i = $p->end(); !$i->at_end(); --$i)
{
MyPrint->new()->function_operator($i->p_element());
}
# Reverse iterator:
my $ri = reverse_iterator($p->iter())->first();
while (!$ri->at_end())
{
MyPrint->new()->function_operator($ri->p_element());
$ri->next();
}
SEE ALSO
Sourceforge Project Page: http://sourceforge.net/projects/pstl
AUTHOR
m gaffiero, <gaffie@users.sourceforge.net>
CO-MAINTAINER
David Oswald, <davido@cpan.org>
COPYRIGHT AND LICENSE
Copyright ©1999-2007, Mario Gaffiero. All Rights Reserved.
This file is part of Class::STL::Containers(TM).
Class::STL::Containers is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
Class::STL::Containers is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Class::STL::Containers; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 POD Errors
The following errors were encountered while parsing the POD:
- Around line 145:
'=item' outside of any '=over'
- Around line 165:
You forgot a '=back' before '=head2'
- Around line 171:
'=item' outside of any '=over'
- Around line 212:
You forgot a '=back' before '=head1'
- Around line 220:
'=item' outside of any '=over'
- Around line 265:
You forgot a '=back' before '=head2'
- Around line 267:
=begin without a target?
- Around line 287:
'=end' without a target?
- Around line 508:
=begin without a target?
- Around line 552:
'=end' without a target?
- Around line 730:
=begin without a target?
- Around line 754:
'=end' without a target?
- Around line 1036:
=begin without a target?
- Around line 1061:
'=end' without a target?
- Around line 1289:
=begin without a target?
- Around line 1311:
'=end' without a target?