|
################################################################################
##
## simpcomp / propobject.gd
##
## provides object type SCPropertyObject
##
## $Id$
##
################################################################################
#representation
DeclareRepresentation("SCIsPropertyObjectRep",IsComponentObjectRep,
[
"Properties",
"PropertiesTmp",
"PropertyHandlers"
]);
SCPropertyObjectFamily:=NewFamily("SCPropertyObjectFamily",SCIsPropertyObject and SCIsPropertyObjectRep and IsMutable and IsCopyable);
SCPropertyObjectType:=NewType(SCPropertyObjectFamily,SCIsPropertyObject and SCIsPropertyObjectRep and IsAttributeStoringRep);
################################################################################
##<#GAPDoc Label="SCPropertyHandlersSet">
## <ManSection>
## <Meth Name="SCPropertyHandlersSet" Arg="po, handlers"/>
## <Returns><K>true</K></Returns>
## <Description>
## Sets the property handling functions for a SCPropertyObject <Arg>po</Arg> to the functions described in the record <Arg>handlers</Arg>. The record <Arg>handlers</Arg> has to contain entries of the following structure: <C>[Property Name]:=[Function name computing and returning the property]</C>. For <C>SCSimplicialComplex</C> for example <Package>simpcomp</Package> defines (among many others): <C>F:=SCFVector</C>. See the file <C>lib/prophandler.gd</C>.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyHandlersSet,"for SCPropertyObject",
[SCIsPropertyObject,IsRecord],
function(po,handlers)
po!.PropertyHandlers:=handlers;
return true;
end);
################################################################################
##<#GAPDoc Label="SCProperties">
## <ManSection>
## <Meth Name="SCProperties" Arg="po"/>
## <Returns>a record upon success.</Returns>
## <Description>
## Returns the record of all stored properties of the <C>SCPropertyObject</C> <Arg>po</Arg>.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCProperties,"for SCPropertyObject",
[SCIsPropertyObject],
function(po)
return po!.Properties;
end);
################################################################################
##<#GAPDoc Label="SCPropertiesNames">
## <ManSection>
## <Meth Name="SCPropertiesNames" Arg="po"/>
## <Returns>a list upon success.</Returns>
## <Description>
## Returns a list of all the names of the stored properties of the <C>SCPropertyObject</C> <Arg>po</Arg>. These can be accessed via <Ref Meth="SCPropertySet" /> and <Ref Meth="SCPropertyDrop" />.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertiesNames,"for SCPropertyObject",
[SCIsPropertyObject],
function(po)
return RecNames(po!.Properties);
end);
################################################################################
##<#GAPDoc Label="SCPropertyByName">
## <ManSection>
## <Meth Name="SCPropertyByName" Arg="po, name"/>
## <Returns>any value upon success, <K>fail</K> otherwise.</Returns>
## <Description>
## Returns the value of the property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg> if this property is known for <Arg>po</Arg> and <K>fail</K> otherwise. The names of known properties can be accessed via the function <Ref Meth="SCPropertiesNames" />
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyByName,"for SCPropertyObject",
[SCIsPropertyObject,IsString],
function(po,name)
if not IsBound(po!.Properties.(name)) then
return fail;
else
return po!.Properties.(name);
fi;
end);
################################################################################
##<#GAPDoc Label="SCPropertySet">
## <ManSection>
## <Meth Name="SCPropertySet" Arg="po, name, data"/>
## <Returns><K>true</K> upon success.</Returns>
## <Description>
## Sets the value of the property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg> to <Arg>data</Arg>. Note that the argument becomes immutable. If this behaviour is not desired, use <Ref Meth="SCPropertySetMutable" /> instead.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertySet,"for SCPropertyObject",
[SCIsPropertyObject,IsString,IsObject],
function(po,name,data)
MakeImmutable(data);
po!.Properties.(name):=data;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertySetMutable">
## <ManSection>
## <Meth Name="SCPropertySetMutable" Arg="po, name, data"/>
## <Returns><K>true</K> upon success.</Returns>
## <Description>
## Sets the value of the property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg> to <Arg>data</Arg>. Note that the argument does not become immutable. If this behaviour is not desired, use <Ref Meth="SCPropertySet" /> instead.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertySetMutable,"for SCPropertyObject",
[SCIsPropertyObject,IsString,IsObject],
function(po,name,data)
po!.Properties.(name):=data;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertyDrop">
## <ManSection>
## <Meth Name="SCPropertyDrop" Arg="po, name"/>
## <Returns><K>true</K> upopn success, <K>fail</K> otherwise</Returns>
## <Description>
## Drops the property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg>. Returns <K>true</K> if the property is successfully dropped and <K>fail</K> if a property with that name did not exist.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyDrop,"for SCPropertyObject",
[SCIsPropertyObject,IsString],
function(po,name)
if not IsBound(po!.Properties.(name)) then
return fail;
else
Unbind(po!.Properties.(name));
fi;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertiesTmp">
## <ManSection>
## <Meth Name="SCPropertiesTmp" Arg="po"/>
## <Returns>a record upon success.</Returns>
## <Description>
## Returns the record of all stored temporary properties (these are mutable in contrast to regular properties and not serialized when the object is serialized to XML) of the <C>SCPropertyObject</C> <Arg>po</Arg>.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertiesTmp,"for SCPropertyObject",
[SCIsPropertyObject],
function(po)
return po!.PropertiesTmp;
end);
################################################################################
##<#GAPDoc Label="SCPropertiesTmpNames">
## <ManSection>
## <Meth Name="SCPropertiesTmpNames" Arg="po"/>
## <Returns>a list upon success.</Returns>
## <Description>
## Returns a list of all the names of the stored temporary properties of the <C>SCPropertyObject</C> <Arg>po</Arg>. These can be accessed via <Ref Meth="SCPropertyTmpSet" /> and <Ref Meth="SCPropertyTmpDrop" />.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertiesTmpNames,"for SCPropertyObject",
[SCIsPropertyObject],
function(po)
return RecNames(po!.PropertiesTmp);
end);
################################################################################
##<#GAPDoc Label="SCPropertyTmpByName">
## <ManSection>
## <Meth Name="SCPropertyTmpByName" Arg="po, name"/>
## <Returns>any value upon success, <K>fail</K> otherwise.</Returns>
## <Description>
## Returns the value of the temporary property with the name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg> if this temporary property is known for <Arg>po</Arg> and <K>fail</K> otherwise. The names of known temporary properties can be accessed via the function <Ref Meth="SCPropertiesTmpNames" />
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyTmpByName,"for SCPropertyObject",
[SCIsPropertyObject,IsString],
function(po,name)
if not IsBound(po!.PropertiesTmp.(name)) then
return fail;
else
return po!.PropertiesTmp.(name);
fi;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertyTmpSet">
## <ManSection>
## <Meth Name="SCPropertyTmpSet" Arg="po, name, data"/>
## <Returns><K>true</K> upon success.</Returns>
## <Description>
## Sets the value of the temporary property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg> to <Arg>data</Arg>. Note that the argument does not become immutable. This is the standard behaviour for temporary properties.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyTmpSet,"for SCPropertyObject",
[SCIsPropertyObject,IsString,IsObject],
function(po,name,data)
po!.PropertiesTmp.(name):=data;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertyTmpDrop">
## <ManSection>
## <Meth Name="SCPropertyTmpDrop" Arg="po, name"/>
## <Returns><K>true</K> upon success, <K>fail</K> otherwise</Returns>
## <Description>
## Drops the temporary property with name <Arg>name</Arg> of the <C>SCPropertyObject</C> <Arg>po</Arg>. Returns <K>true</K> if the property is successfully dropped and <K>fail</K> if a temporary property with that name did not exist.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertyTmpDrop,"for SCPropertyObject",
[SCIsPropertyObject,IsString],
function(po,name)
if not IsBound(po!.PropertiesTmp.(name)) then
return fail;
else
Unbind(po!.PropertiesTmp.(name));
fi;
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertiesFlush">
## <ManSection>
## <Meth Name="SCPropertiesFlush" Arg="po"/>
## <Returns><K>true</K> upon success.</Returns>
## <Description>
## Drops all properties and temporary properties of the <C>SCPropertyObject</C> <Arg>po</Arg>.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertiesFlush,
[SCIsPropertyObject],
function(po)
po!.Properties:=rec();
po!.PropertiesTmp:=rec();
return true;
end);
################################################################################
##<#GAPDoc Label="SCPropertiesManaged">
## <ManSection>
## <Meth Name="SCPropertiesManaged" Arg="po"/>
## <Returns>a list of managed properties upon success, <K>fail</K> otherwise.</Returns>
## <Description>
## Returns a list of all properties that are managed for the <C>SCPropertyObject</C> <Arg>po</Arg> via property handler functions. See <Ref Meth="SCPropertyHandlersSet" />.
## </Description>
## </ManSection>
##<#/GAPDoc>
################################################################################
InstallMethod(SCPropertiesManaged,
[SCIsPropertyObject],
function(po)
if(not IsBound(po!.PropertyHandlers)) then
return fail;
fi;
return Concatenation(RecNames(po!.PropertyHandlers),RecNames(po!.Properties));
end);
#see whether property is handled or exists
InstallMethod(
IsBound\.,"for SCPropertyObject",
[SCIsPropertyObject, IsPosInt],
function(po, key)
local strid;
strid:=NameRNam(key);
if(IsBound(po!.PropertyHandlers.(strid)) or IsBound(po!.Properties.(strid))) then
return true;
else
return false;
fi;
end);
InstallMethod(
IsBound\.,"for SCPropertyObject",
[SCIsPolyhedralComplex, IsPosInt],
function(po, key)
local strid;
strid:=NameRNam(key);
if(IsBound(po!.PropertyHandlers.(strid)) or IsBound(po!.(strid))) then
return true;
else
return false;
fi;
end);
#access a property
InstallMethod(
\.,"for SCPropertyObject",
[SCIsPropertyObject, IsPosInt],
function(po, key)
local strid;
strid:=NameRNam(key);
if(IsBound(po!.PropertyHandlers.(strid))) then
if(IsBound(SCIntFunc.PropertyHandlersNoargs.(strid))) then
return po!.PropertyHandlers.(strid)(po);
else
return SCIntFunc.WrapperFunc(po!.PropertyHandlers.(strid),po);
fi;
elif IsBound(po!.Properties.(strid)) then
return po!.Properties.(strid);
else
Info(InfoSimpcomp,1,"SCPropertyObject: unhandled property '",strid,"'. Handled properties are ",Concatenation(RecNames(po!.PropertyHandlers),RecNames(po!.Properties)),".");
return fail;
fi;
end);
#wrapper function for pseudo-object-orientation
SCIntFunc.WrapperFunc:=
function(func,obj)
return function(arg) return CallFuncList(func,Concatenation([obj],arg)); end;
end;
SCIntFunc.ParseParameters:=
function(params)
local sc,larg;
if(SCIntFunc._SC<>fail) then
sc:=SCIntFunc._SC;
SCIntFunc._SC:=fail;
larg:=params;
else
if(Length(params)=0 or not SCIsSimplicialComplex(params[1])) then
return fail;
else
sc:=params[1];
fi;
larg:=params{[2..Length(params)]};
fi;
return [sc,larg];
end;
SCIntFunc.EnsureParameters:=
function(func,params,filters,types)
local i;
if(IsList(params) and not IsStringRep(params)) then
if(Length(params)<>Length(filters)) then
Info(InfoSimpcomp,1,"SCIntFunc.EnsureParameters: number of parameters and number of types do not match.");
return false;
fi;
for i in [1..Length(params)] do
if(not filters[i](params[i])) then
Info(InfoSimpcomp,1,func,": wrong arguments, expected ",types,".");
return false;
fi;
od;
return true;
else
return types(params);
fi;
end;
[ Dauer der Verarbeitung: 0.28 Sekunden
(vorverarbeitet)
]
|