--- trunk/src/selection/SelectionEvaluator.cpp 2005/02/04 22:39:26 288 +++ trunk/src/selection/SelectionEvaluator.cpp 2005/02/15 19:36:07 351 @@ -49,8 +49,8 @@ namespace oopse { namespace oopse { -SelectionEvaluator::SelectionEvaluator(SimInfo* si) : info(si), finder(info), isLoaded_(false){ - +SelectionEvaluator::SelectionEvaluator(SimInfo* si) : info(si), nameFinder(info), distanceFinder(info), isLoaded_(false){ + nStuntDouble = info->getNGlobalAtoms() + info->getNRigidBodies(); } bool SelectionEvaluator::loadScript(const std::string& filename, const std::string& script) { @@ -102,7 +102,7 @@ bool SelectionEvaluator::loadScriptFileInternal(const } bool SelectionEvaluator::loadScriptFileInternal(const std::string & filename) { - ifstream ifs(filename.c_str()); + std::ifstream ifs(filename.c_str()); if (!ifs.is_open()) { return false; } @@ -181,6 +181,8 @@ void SelectionEvaluator::instructionDispatchLoop(BitSe case Token::name: stack.push(nameInstruction(boost::any_cast(instruction.value))); break; + case Token::index: + stack.push(indexInstruction(instruction.value)); break; case Token::identifier: stack.push(lookupValue(boost::any_cast(instruction.value))); @@ -211,6 +213,7 @@ BitSet SelectionEvaluator::comparatorInstruction(const float comparisonValue = boost::any_cast(instruction.value); float propertyValue; BitSet bs(nStuntDouble); + bs.clearAll(); SimInfo::MoleculeIterator mi; Molecule* mol; @@ -277,14 +280,19 @@ void SelectionEvaluator::withinInstruction(const Token } void SelectionEvaluator::withinInstruction(const Token& instruction, BitSet& bs){ - + boost::any withinSpec = instruction.value; + float distance; if (withinSpec.type() == typeid(float)){ - // - return; + distance = boost::any_cast(withinSpec); + } else if (withinSpec.type() == typeid(int)) { + distance = boost::any_cast(withinSpec); + } else { + evalError("casting error in withinInstruction"); + bs.clearAll(); } - evalError("Unrecognized within parameter"); + bs = distanceFinder.find(bs, distance); } void SelectionEvaluator::define() { @@ -292,7 +300,7 @@ void SelectionEvaluator::define() { std::string variable = boost::any_cast(statement[1].value); - variables.insert(std::make_pair(variable, expression(statement, 2))); + variables.insert(VariablesType::value_type(variable, expression(statement, 2))); } @@ -311,7 +319,7 @@ void SelectionEvaluator::predefine(const std::string& int tok = statement[1].tok; if (tok == Token::identifier || (tok & Token::predefinedset) == Token::predefinedset) { std::string variable = boost::any_cast(statement[1].value); - variables.insert(std::make_pair(variable, statement)); + variables.insert(VariablesType::value_type(variable, statement)); } else { evalError("invalid variable name:" + script); @@ -334,24 +342,27 @@ BitSet SelectionEvaluator::lookupValue(const std::stri BitSet SelectionEvaluator::lookupValue(const std::string& variable){ + BitSet bs(nStuntDouble); std::map::iterator i = variables.find(variable); - + if (i != variables.end()) { if (i->second.type() == typeid(BitSet)) { return boost::any_cast(i->second); } else if (i->second.type() == typeid(std::vector)){ - BitSet bs = expression(boost::any_cast >(i->second), 2); + bs = expression(boost::any_cast >(i->second), 2); i->second = bs; /**@todo fixme */ return bs; } } else { unrecognizedIdentifier(variable); } + + return bs; } BitSet SelectionEvaluator::nameInstruction(const std::string& name){ - return finder.match(name); + return nameFinder.match(name); } @@ -375,12 +386,36 @@ BitSet SelectionEvaluator::evaluate() { BitSet SelectionEvaluator::evaluate() { BitSet bs(nStuntDouble); if (isLoaded_) { + pc = 0; instructionDispatchLoop(bs); } return bs; } - + +BitSet SelectionEvaluator::indexInstruction(const boost::any& value) { + BitSet bs(nStuntDouble); + + if (value.type() == typeid(int)) { + int index = boost::any_cast(value); + if (index < 0 || index >= bs.size()) { + invalidIndex(index); + } else { + bs.setBitOn(index); + } + } else if (value.type() == typeid(std::pair)) { + std::pair indexRange= boost::any_cast >(value); + assert(indexRange.first <= indexRange.second); + if (indexRange.first < 0 || indexRange.second >= bs.size()) { + invalidIndexRange(indexRange); + }else { + bs.setRangeOn(indexRange.first, indexRange.second); + } + } + + return bs; +} + //BitSet SelectionEvaluator::evaluate(int frameNo) { // //}