#include "../config/pathan_config.h" /* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #include #include #include #include #include #include DataItemIf::DataItemIf(DataItem* test, DataItem* whenTrue, DataItem* whenFalse, XPath2MemoryManager* memMgr) : DataItemImpl(memMgr), _test(test), _whenTrue(whenTrue), _whenFalse(whenFalse) { setType(DataItem::IF); } Sequence DataItemIf::collapseTreeInternal(DynamicContext* context, int flags) const { if(_test->collapseTree(context,DataItem::UNORDERED|DataItem::RETURN_TWO).getEffectiveBooleanValue(context)) return _whenTrue->collapseTree(context,flags); return _whenFalse->collapseTree(context,flags); } DataItem* DataItemIf::staticResolution(StaticContext *context, StaticResolutionContext *src) { StaticResolutionContext newSrc(context->getMemoryManager()); _test = _test->staticResolution(context, &newSrc); if(_test->isConstant()) { DynamicContext *dContext = context->createDynamicContext(); Sequence arg(_test->collapseTree(dContext)); if(arg.getEffectiveBooleanValue(dContext)) { _whenTrue->addPredicates(getPredicates()); return _whenTrue->staticResolution(context, src); } else { _whenFalse->addPredicates(getPredicates()); return _whenFalse->staticResolution(context, src); } } else { src->add(&newSrc); _whenTrue = _whenTrue->staticResolution(context, src); _whenFalse = _whenFalse->staticResolution(context, src); return resolvePredicates(context, src); } } const DataItem *DataItemIf::getTest() const { return _test; } const DataItem *DataItemIf::getWhenTrue() const { return _whenTrue; } const DataItem *DataItemIf::getWhenFalse() const { return _whenFalse; } void DataItemIf::setTest(DataItem *item) { _test = item; } void DataItemIf::setWhenTrue(DataItem *item) { _whenTrue = item; } void DataItemIf::setWhenFalse(DataItem *item) { _whenFalse = item; }