📄 catalogue.pm
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
# Name : ETL::Pequel3::Type::Catalogue.pm
# Created : 21 June 2006
# Author : Mario Gaffiero (gaffie)
#
# Copyright 1999-2007 Mario Gaffiero.
#
# This file is part of Pequel(TM).
#
# Pequel 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.
#
# Pequel 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 Pequel; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# ----------------------------------------------------------------------------------------------------
# Modification History
# When Version Who What
# ----------------------------------------------------------------------------------------------------
package ETL::Pequel3::Type::Catalogue;
require 5.005_62;
use strict;
use warnings;
use stl;
# ----------------------------------------------------------------------------------------------------
#?
#? package ETL::Pequel3::Type::Catalogue::FindName;
#? use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
#? use Class::STL::ClassMembers qw( name target_mem_name );
#? use Class::STL::ClassMembers::Constructor;
#? sub function_operator
#? {
#? my $self = shift;
#? my $arg = shift; # element object
#? my $n = $self->target_mem_name();
#? return $arg->$n() eq $self->name() ? 1 : 0; # !! Must return 1 (not object) !!
#? }
#?
#? ----------------------------------------------------------------------------------------------------
#?
#? package ETL::Pequel3::Type::Catalogue::FindNameMulti;
#? use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
#? use Class::STL::ClassMembers qw( name target_mem_name );
#? use Class::STL::ClassMembers::Constructor;
#? sub function_operator
#? {
#? my $self = shift;
#? my $arg = shift; # element object
#? my @n = split("[|]", $self->target_mem_name(), -1);
#? foreach my $n (@n) {
#? return 1 if (defined($arg->$n()) && $arg->$n() eq $self->name()); # !! Must return 1 (not object) !!
#? }
#? return 0;
#? }
#?
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Catalogue;
use base qw(Class::STL::Containers::Deque);
use Class::STL::ClassMembers qw( err catalogue_name fptr_find_name ),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'Class::STL::Element');
use Class::STL::ClassMembers::Constructor;
use vars qw( $AUTOLOAD );
sub AUTOLOAD
{
my $self = shift;
(my $cat = $AUTOLOAD) =~ s/.*:://;
my $c;
$c = $self->exists($cat);
$self->err()->user_error(10602, "Unknown name '$cat' in catalogue '@{[ $self->catalogue_name() ]}'!")
unless (ref($c));
return $c;
}
sub DESTROY { }
sub new_extra
{
my $self = shift;
use ETL::Pequel3::Error;
$self->err(ETL::Pequel3::Error->new());
#? $self->fptr_find_name($self->target_mem_name() =~ /|/
#? ? ETL::Pequel3::Type::Catalogue::FindNameMulti->new()
#? : ETL::Pequel3::Type::Catalogue::FindName->new()
#? );
return $self;
}
sub exists
{
my $self = shift;
my $name = shift;
if ($self->target_mem_name() =~ /|/)
{
my @n = split("[|]", $self->target_mem_name(), -1);
foreach my $n (@n) {
my @l = grep(defined($_->$n()) && $_->$n() eq $name, $self->to_array());
return $l[0] if (@l);
}
}
else
{
my $n = $self->target_mem_name();
my @l = grep($_->$n() eq $name, $self->to_array());
return $l[0] if (@l);
}
return 0;
}
#Memory leak here + very slow!
#? sub exists
#? {
#? my $self = shift;
#? my $name = shift;
#? my $s;
#? # TODO: BUG here -- must check return for ref()
#? return $s->p_element()
#? if
#? (
#? $s = stl::find_if
#? (
#? $self->begin(),
#? $self->end(),
#? $self->fptr_find_name()->new
#? (
#? name => $name,
#? target_mem_name => $self->target_mem_name()
#? )
#? )
#? );
#? return 0;
#? }
}
# ----------------------------------------------------------------------------------------------------
1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -