Code Search for Developers
 
 
  

FfoldStepper.C from Magnus at Krugle


Show FfoldStepper.C syntax highlighted

#include "crossTrainer.h"
#include "FfoldStepper.h"
#include "FGLvar.h"
#include "GLfunctions.h"
	
FfoldStepper::FfoldStepper(FGLvar *v,long edgeRefOffset,long orientedEdgesNo,
	              const GLref& startPacket){
	this->v=v;
	this->edgeRefOffset=edgeRefOffset;
	this->orientedEdgesNo=orientedEdgesNo;
	packetRef=startPacket;
}

Boolean FfoldStepper::firstEdge(void){
	edgeIndex=0;
	edgeSign=-1;
	count=-1;
	// place the edge ref sizeof(GLref) bytes BEFORE the first
	// slot, so that the call to nextEdge advances to the first slot
	edgeRef.index=packetRef.index;
	edgeRef.offset=packetRef.offset+edgeRefOffset-(long)sizeof(GLref);
	return(nextEdge());
}

Boolean FfoldStepper::nextEdge(void){
	// this routine only scans the packet at location packetRef
	// When the scan is done, loads the location of the next packet
	// at packetRef.  If there is no next packet, loads NA.
	// Its up to the caller to check for the next packet.  If it
	// exists, the next packet can then be scanned by calling firstEdge,
	// followed by calls to nextEdge
	
	Ptr packetDEREF=v&packetRef;
	Ptr DEREF=v->xCheckPtr(edgeRef);  // this is a counter inside packetRef
	DEREF=&DEREF[sizeof(GLref)]; // advance to next entry
	if(edgeSign<0)++edgeIndex;
	edgeSign=-edgeSign;
	++count;
	Boolean seeking=TRUE;
	while(seeking){
		while(seeking && count<orientedEdgesNo){
			BlockMove(DEREF,(Ptr)&refDatum,sizeof(GLref));
			if(!(seeking=isNull(refDatum))){
				edgeRef.index=packetRef.index;
				edgeRef.offset=packetRef.offset
								  +edgeRefOffset+count*sizeof(GLref);
				v->e=edgeIndex*edgeSign;
			}
			else {
				DEREF=&DEREF[sizeof(GLref)]; // advance to next entry
				if(edgeSign<0)++edgeIndex;
				edgeSign=-edgeSign;
				++count;
			}
		}
		if(seeking){
			GLref oldRef=packetRef;
			v->xGetPacketNext(packetRef,packetDEREF);
			v-oldRef;
			return(FALSE);  // all edges in packet have been 
							// processed
		}
	}
	v-packetRef;
	return(TRUE);  // an edge has been found
}




See more files for this project here

Magnus

Magnus is a special purpose mathematical package for Infinite Group Theory computations

Project homepage: http://sourceforge.net/projects/magnus
Programming language(s): C,C++
License: other

  FBlockManager.C
  FBlockManager.h
  FGLink.C
  FGLink.h
  FGLnode.C
  FGLnode.h
  FGLrecycleStack.C
  FGLrecycleStack.h
  FGLstack.C
  FGLstack.h
  FGLstepper.C
  FGLstepper.h
  FGLwalkNode.C
  FGLwalkNode.h
  FcleanUpNode.C
  FcleanUpNode.h
  FcloneNode.C
  FcloneNode.h
  FdebugNode.C
  FdebugNode.h
  FfoldNode.C
  FfoldNode.h
  FfoldStepper.C
  FfoldStepper.h
  FgrowNode.C
  FgrowNode.h
  FrandomRef.C
  FrandomRef.h
  FreducedFoldNode.C
  FreducedFoldNode.h
  FreducedVertexFolder.C
  FreducedVertexFolder.h
  FvertexFolder.C
  FvertexFolder.h
  GLfunctions.C
  GLfunctions.h
  GLref.h
  _FnameNode.cp_
  _FnameNode.h_
  _FrankNode.cp_
  _FrankNode.h_
  _FstrToGLvarNode.cp_
  _FstrToGLvarNode.h_
  debugGLink.C
  debugGLink.h