BOOST_FOREACH(const CMap::value_type &vt, keep_columns) { string field_name(vt.first.substr(2)); string output_field_xml; if (prefixequal(vt.first, "a.") && a_name_to_val_pos.exists(field_name)) { // case 1 TINVARIANT(a_series.getTypePtr()->hasColumn(field_name)); output_field_xml = renameField(a_series.getTypePtr(), field_name, vt.second); extractors.push_back (ExtractorValue::make(vt.second, a_name_to_val_pos[field_name])); } else if (prefixequal(vt.first, "a.") && eq_columns.find(field_name) != eq_columns.end()) { // case 2a const string b_field_name(eq_columns.find(field_name)->second); TINVARIANT(b_series.getTypePtr()->hasColumn(b_field_name)); output_field_xml = renameField(a_series.getTypePtr(), field_name, vt.second); GeneralField::Ptr b_field(GeneralField::make(b_series, b_field_name)); extractors.push_back(ExtractorField::make(vt.second, b_field)); } else if (prefixequal(vt.first, "b.") && b_series.getTypePtr()->hasColumn(field_name)) { // case 2b output_field_xml = renameField(b_series.getTypePtr(), field_name, vt.second); GeneralField::Ptr b_field(GeneralField::make(b_series, field_name)); extractors.push_back(ExtractorField::make(vt.second, b_field)); } else { requestError("invalid extraction"); } output_xml.append(output_field_xml); }
template<typename INT> uint32_t test_int_type(const string &type) { typedef INT test_int_t; HashMap<test_int_t, uint32_t> hm; typedef map<test_int_t, uint32_t> stdmap_t; typedef typename stdmap_t::iterator iterator_t; stdmap_t stdmap; static const unsigned max_ents = 1000; { for(unsigned i = 0; i < max_ents; ++i) { test_int_t k = static_cast<test_int_t>(rng.randLongLong()); uint32_t v = rng.randInt(); hm[k] = v; stdmap[k] = v; SINVARIANT(hm.size() == stdmap.size()); } } { // test overwrite; for(iterator_t i = stdmap.begin(); i != stdmap.end(); ++i) { SINVARIANT(hm[i->first] == i->second); hm[i->first] = i->second; } SINVARIANT(hm.size() == stdmap.size()); } uint32_t ret = 0; { // test removal while(!stdmap.empty()) { iterator_t i = stdmap.begin(); test_int_t k = i->first; uint32_t v = i->second; ret ^= k ^ v; SINVARIANT(hm[k] == v); hm.remove(k); if (!hm.exists(k + max_ents)) { // had a bug where removal of non-existent things gave // incorrect size count. However, removal of // something that actually exists (low probability, // but possible) gives an error on hm vs stdmap size. hm.remove(k + max_ents, false); } stdmap.erase(i); INVARIANT(hm.size() == stdmap.size(), format("%d != %d") % hm.size() % stdmap.size()); } SINVARIANT(hm.size() == 0); } cout << format("Finished testing int type %s hash-val %u\n") % type % ret; return ret; }