Data Access

typedefs assumed below (you can use them in your code):

typedef FATableItr<L>          ILeft;
typedef FATableItr<R>          IRight;
typedef Lattice<L,R,LD>        Lattice;
typedef Lattice::LinkData      LinkData; // _linkdata_type_
typedef Lattice::LeftID        LeftID;
typedef Lattice::RightID       RightID;
typedef Lattice::VectorLeftID  VectorLeftID;  // vector<LeftID>
typedef Lattice::VectorRightID VectorRightID; // vector<RightID>
typedef Lattice::LeftItr       LeftItr;  // VectorLeftID ::const_iterator
typedef Lattice::RightItr      RightItr; // VectorRightID::const_iterator
typedef Lattice::Links         Links;    // vector<Link*>
typedef Lattice::LinkItr       LinkItr;  // Links::const_iterator

General information:

const VectorLeftID&  ld = pLattice->vLeftID ();
const VectorRightID& rd = pLattice->vRightID();
const Links& links = pLattice->links();
DABoolean empty = pLattice->isEmpty();
DABoolean b = pLattice->isLNodeMulti(); // Left  objects may have many links.
DABoolean b = pLattice->isRNodeMulti(); // Right objects may have many links.
DABoolean b = pLattice->isLLinkMulti(); // Many left  objects may share a link.
DABoolean b = pLattice->isRLinkMulti(); // Many right objects may share a link.
string s = topologyText();
cout << topologyText();

Navigation:

const VectorLeftID*  vLL = pLattice->vLeftGivenLeft  (LeftID);
const VectorLeftID*  vLL = pLattice->vLeftGivenLeft  (LeftItr);
const VectorLeftID*  vLL = pLattice->vLeftGivenLeft  (FATableItr<L>);

const VectorRightID* vRR = pLattice->vRightGivenRight(RightID);
const VectorRightID* vRR = pLattice->vRightGivenRight(RightItr);
const VectorRightID* vRR = pLattice->vRightGivenRight(FATableItr<R>);

const VectorRightID* vRL = pLattice->vRightGivenLeft (LeftID);
const VectorRightID* vRL = pLattice->vRightGivenLeft (LeftItr);
const VectorRightID* vRL = pLattice->vRightGivenLeft (FATableItr<L>);

const VectorLeftID*  vLR = pLattice->vLeftGivenRight (RightID);
const VectorLeftID*  vLR = pLattice->vLeftGivenRight (RightItr);
const VectorLeftID*  vLR = pLattice->vLeftGivenRight (FATableItr<R>);
const LeftID*  LL = pLattice->leftIDGivenLeft  (LeftID);
const LeftID*  LL = pLattice->leftIDGivenLeft  (LeftItr);
const LeftID*  LL = pLattice->leftIDGivenLeft  (FATableItr<L>);

const RightID* RR = pLattice->rightIDGivenRight(RightID);
const RightID* RR = pLattice->rightIDGivenRight(RightItr);
const RightID* RR = pLattice->rightIDGivenRight(FATableItr<R>);

const RightID* RL = pLattice->rightIDGivenLeft (LeftID);
const RightID* RL = pLattice->rightIDGivenLeft (LeftItr);
const RightID* RL = pLattice->rightIDGivenLeft (FATableItr<L>);

const LeftID*  LR = pLattice->leftIDGivenRight (RightID);
const LeftID*  LR = pLattice->leftIDGivenRight (RightItr);
const LeftID*  LR = pLattice->leftIDGivenRight (FATableItr<R>);
const VectorLeftID& vlid = pLattice->vLeftID();
for (LeftItr li = vlid.begin();  li != vlid.end();  ++li)
{ const VectorRightID& vrid =  (*li)->vRightGivenLeft();
  for (RightItr ri = vrid.begin();  ri != vrid.end();  ++ri)
  { value = RightTable.find(*ri)->value();
  }
}

The above code works both for FATables and FAPtrTables. If you have an FATable, then this works also:
value = RightTable[*ri].value();
FAPtrTable
s don't support operator[].

const Links* pLinks = linksGivenLeft(LeftID);
const Links* pLinks = linksGivenLeft(LeftItr);
const Links* pLinks = linksGivenLeft(FATableItr<L>);

const Links* pLinks = linksGivenRight(RightID);
const Links* pLinks = linksGivenRight(RightItr);
const Links* pLinks = linksGivenRight(FATableItr<R>);

Loop over a node's links like this::

Links::const_iterator i    = links.begin();
Links::const_iterator iEnd = links.end();
for (; i != iEnd; ++i)
{ Link* pLink = *i;
  ...
}
Link* pLink = linkGivenLeft(LeftID);
Link* pLink = linkGivenLeft(LeftItr);
Link* pLink = linkGivenLeft(FATableItr<L>);

Link* pLink = linkGivenRight(RightID);
Link* pLink = linkGivenRight(RightItr);
Link* pLink = linkGivenRight(FATableItr<R>);
void connectLinks   (LeftID,        RightID,       Links&);
void connectLinks   (LeftItr,       RightItr,      Links&);
void connectLinks   (FATableItr<L>, FATableItr<R>, Links&);

void shareLinksLeft (LeftID,        LeftID,        Links&);
void shareLinksLeft (LeftItr,       LeftItr,       Links&);
void shareLinksLeft (FATableItr<L>, FATableItr<L>, Links&);

void shareLinksRight(RightID,       RightID,       Links&);
void shareLinksRight(RightItr,      RightItr,      Links&);
void shareLinksRight(FATableItr<R>, FATableItr<R>, Links&);
Link* connectLink   (LeftID,        RightID);
Link* connectLink   (LeftItr,       RightItr);
Link* connectLink   (FATableItr<L>, FATableItr<R>);

link* shareLinkLeft (LeftID,        LeftID);
Link* shareLinkLeft (LeftItr,       LeftItr);
Link* shareLinkLeft (FATableItr<L>, FATableItr<L>);

Link* shareLinkRight(RightID,       RightID);
Link* shareLinkRight(RightItr,      RightItr);
Link* shareLinkRight(FATableItr<R>, FATableItr<R>);
LinkData& ld = pLink->linkData();

ld is a reference to your link data class for this link. Do whatever you want with it. You have write access.

const VectorLeftID&  vlid = pLink->vLeftID ();
const VectorRightID& vrid = pLink->vRightID();
const LeftID*  lid = pLink->leftID ();
const RightID* rid = pLink->rightID();


email: Jon J. Thaler $Id: LatticeDataAccess.html,v 1.1 1999/07/18 23:00:34 jjt Exp $