bool *flattenBVecList(int t, int vecDim, BoolVecList* pboolVecList) { int szvec = 0; bool *array = NULL; // walk through the vector list and check few things then send the packed version bool *p = NULL; for(int i=0; i<(int)pboolVecList->size(); i++) { if(szvec == 0) { szvec = (int)((*pboolVecList)[i]->size()); p = array = new bool[szvec * pboolVecList->size()]; // we assume all vectors are the same size } else if(szvec != (*pboolVecList)[i]->size()) { yyerror("Vector list has inconsistent vectors\n"); continue; } BoolList* pfl = (*pboolVecList)[i]; for(int j=0; j<(int)pfl->size(); j++) *p++ = (*pfl)[j]; delete pfl; } if(vecDim < 0) vecDim = (int)pboolVecList->size(); // we do the test here in any case : the previous loop needed to do some "delete" anyways if((szvec != vecDim) || (t != pboolVecList->size())) { yyerror("Vector dimension in value assignment don't match the type\n"); delete array; return NULL; } return array; }
BoolList ParsedEntity::getBoolList() { auto pList = getList(); auto list = *pList; BoolList retList = MakeBoolList(); for (ParsedEntityPtr pe : list) { if (pe->getType() == ParsedEntity::Bool) { retList->push_back(pe->getBool()); } } return retList; }
TEST(ConceptSink, OneHundredSinks) { using namespace g3; BoolList flags; IntVector counts; size_t NumberOfItems = 100; for (size_t index = 0; index < NumberOfItems; ++index) { flags.push_back(make_shared < atomic<bool >> (false)); counts.push_back(make_shared < atomic<int >> (0)); } { RestoreFileLogger logger{"./"}; g3::LogWorker* worker = logger._scope->get(); //g3LogWorker::createLogWorker(); size_t index = 0; for (auto& flag : flags) { auto& count = counts[index++]; // ignore the handle worker->addSink(std2::make_unique<ScopedSetTrue>(flag, count), &ScopedSetTrue::ReceiveMsg); } LOG(DEBUG) << "start message"; LogMessagePtr message1{std2::make_unique<LogMessage>("test", 0, "test", DEBUG)}; LogMessagePtr message2{std2::make_unique<LogMessage>("test", 0, "test", DEBUG)}; auto& write1 = message1.get()->write(); write1.append("Hello to 100 receivers :)"); worker->save(message1); auto& write2 = message2.get()->write(); write2.append("Hello to 100 receivers :)"); worker->save(message2); LOG(INFO) << "end message"; logger.reset(); } // at the curly brace above the ScopedLogger will go out of scope and all the // 100 logging receivers will get their message to exit after all messages are // are processed size_t index = 0; for (auto& flag : flags) { auto& count = counts[index++]; ASSERT_TRUE(flag->load()) << ", count : " << (index - 1); ASSERT_TRUE(4 == count->load()) << ", count : " << (index - 1); } cout << "test one hundred sinks is finished finished\n"; }