예제 #1
0
파일: Xml.cpp 프로젝트: Ahbee/Cinder
XmlTree::ConstIter::ConstIter( const XmlTree &root, const string &filterPath, bool caseSensitive, char separator )
	: mCaseSensitive( caseSensitive )
{
	mFilter = split( filterPath, separator );

	// we ignore a leading separator so that "/one/two" is equivalent to "one/two"
	if( ( ! filterPath.empty() ) && ( filterPath[0] == separator ) && ( ! mFilter.empty() ) )
		mFilter.erase( mFilter.begin() );

	if( mFilter.empty() ) { // empty filter means nothing matches
		setToEnd( &root.getChildren() );
		return;
	}	

	for( vector<string>::const_iterator filterComp = mFilter.begin(); filterComp != mFilter.end(); ++filterComp ) {
		if( mIterStack.empty() ) // first item
			mSequenceStack.push_back( &root.getChildren() );
		else
			mSequenceStack.push_back( &(*mIterStack.back())->getChildren() );
		
		Container::const_iterator child = findNextChildNamed( *mSequenceStack.back(), mSequenceStack.back()->begin(), *filterComp, mCaseSensitive );
		if( child != (mSequenceStack.back())->end() )
			mIterStack.push_back( child );
		else { // failed to find an item that matches this part of the filter; mark as finished and return
			setToEnd( &root.getChildren() );
			return;
		}
	}
}
예제 #2
0
/* public */
void
LinearLocation::clamp(const Geometry* linear)
{
	if (componentIndex >= linear->getNumGeometries())
	{
		setToEnd(linear);
		return;
	}
	if (segmentIndex >= linear->getNumPoints())
	{
		const LineString* line = dynamic_cast<const LineString*> (linear->getGeometryN(componentIndex));
		segmentIndex = line->getNumPoints() - 1;
		segmentFraction = 1.0;
	}
}