Ticket #302: 302-improvements-main-6e8c27ee9079.patch
File 302-improvements-main-6e8c27ee9079.patch, 7.9 KB (added by , 16 years ago) |
---|
-
lemon/maps.h
# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 1248365639 -7200 # Node ID 6e8c27ee907910245a2f2142e853588b989b86c1 # Parent 7b1a6e9630188b425c35b77110d67547eb1c2a00 Improvements for graph maps (#302) - Add a count() function to CrossRefMap. - Add tests for IdMap and RangeIdMap. - Extend tests for CrossRefMap. - Improve the doc. diff --git a/lemon/maps.h b/lemon/maps.h
a b 1826 1826 /// Using this map you get access (i.e. can read) the inner id values of 1827 1827 /// the items stored in the graph, which is returned by the \c id() 1828 1828 /// function of the graph. This map can be inverted with its member 1829 /// class \c InverseMap or with the \c operator() member.1829 /// class \c InverseMap or with the \c operator()() member. 1830 1830 /// 1831 1831 /// \tparam GR The graph type. 1832 1832 /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or … … 2033 2033 typename Container::const_iterator it = _inv_map.find(val); 2034 2034 return it != _inv_map.end() ? it->second : INVALID; 2035 2035 } 2036 2037 /// \brief Returns the number of items with the given value. 2038 /// 2039 /// This function returns the number of items with the given value 2040 /// associated with it. 2041 int count(const Value &val) const { 2042 return _inv_map.count(val); 2043 } 2036 2044 2037 2045 protected: 2038 2046 … … 2122 2130 2123 2131 }; 2124 2132 2125 /// \brief Provides continuous and unique IDfor the2133 /// \brief Provides continuous and unique id for the 2126 2134 /// items of a graph. 2127 2135 /// 2128 2136 /// RangeIdMap provides a unique and continuous 2129 /// IDfor each item of a given type (\c Node, \c Arc or2137 /// id for each item of a given type (\c Node, \c Arc or 2130 2138 /// \c Edge) in a graph. This id is 2131 2139 /// - \b unique: different items get different ids, 2132 2140 /// - \b continuous: the range of the ids is the set of integers … … 2137 2145 /// Thus this id is not (necessarily) the same as what can get using 2138 2146 /// the \c id() function of the graph or \ref IdMap. 2139 2147 /// This map can be inverted with its member class \c InverseMap, 2140 /// or with the \c operator() member.2148 /// or with the \c operator()() member. 2141 2149 /// 2142 2150 /// \tparam GR The graph type. 2143 2151 /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or -
test/maps_test.cc
diff --git a/test/maps_test.cc b/test/maps_test.cc
a b 329 329 // LoggerBoolMap 330 330 { 331 331 typedef std::vector<int> vec; 332 checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >(); 333 checkConcept<WriteMap<int, bool>, 334 LoggerBoolMap<std::back_insert_iterator<vec> > >(); 335 332 336 vec v1; 333 337 vec v2(10); 334 338 LoggerBoolMap<std::back_insert_iterator<vec> > … … 350 354 check(v1[i++] == *it, "Something is wrong with LoggerBoolMap"); 351 355 } 352 356 357 // IdMap, RangeIdMap 358 { 359 typedef ListDigraph Graph; 360 DIGRAPH_TYPEDEFS(Graph); 361 362 checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >(); 363 checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >(); 364 checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >(); 365 checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >(); 366 367 Graph gr; 368 IdMap<Graph, Node> nmap(gr); 369 IdMap<Graph, Arc> amap(gr); 370 RangeIdMap<Graph, Node> nrmap(gr); 371 RangeIdMap<Graph, Arc> armap(gr); 372 373 Node n0 = gr.addNode(); 374 Node n1 = gr.addNode(); 375 Node n2 = gr.addNode(); 376 377 Arc a0 = gr.addArc(n0, n1); 378 Arc a1 = gr.addArc(n0, n2); 379 Arc a2 = gr.addArc(n2, n1); 380 Arc a3 = gr.addArc(n2, n0); 381 382 check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap"); 383 check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap"); 384 check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap"); 385 386 check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap"); 387 check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap"); 388 check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap"); 389 check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap"); 390 391 check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap"); 392 check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap"); 393 394 check(nrmap.size() == 3 && armap.size() == 4, 395 "Wrong RangeIdMap::size()"); 396 397 check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap"); 398 check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap"); 399 check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap"); 400 401 check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap"); 402 check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap"); 403 check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap"); 404 check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap"); 405 406 check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap"); 407 check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap"); 408 409 gr.erase(n1); 410 411 if (nrmap[n0] == 1) nrmap.swap(n0, n2); 412 nrmap.swap(n2, n0); 413 if (armap[a1] == 1) armap.swap(a1, a3); 414 armap.swap(a3, a1); 415 416 check(nrmap.size() == 2 && armap.size() == 2, 417 "Wrong RangeIdMap::size()"); 418 419 check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap"); 420 check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap"); 421 422 check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap"); 423 check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap"); 424 425 check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap"); 426 check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap"); 427 } 428 353 429 // CrossRefMap 354 430 { 355 431 typedef ListDigraph Graph; … … 357 433 358 434 checkConcept<ReadWriteMap<Node, int>, 359 435 CrossRefMap<Graph, Node, int> >(); 436 checkConcept<ReadWriteMap<Node, bool>, 437 CrossRefMap<Graph, Node, bool> >(); 438 checkConcept<ReadWriteMap<Node, double>, 439 CrossRefMap<Graph, Node, double> >(); 360 440 361 441 Graph gr; 362 442 typedef CrossRefMap<Graph, Node, char> CRMap; … … 370 450 map.set(n0, 'A'); 371 451 map.set(n1, 'B'); 372 452 map.set(n2, 'C'); 453 454 check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0, 455 "Wrong CrossRefMap"); 456 check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1, 457 "Wrong CrossRefMap"); 458 check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2, 459 "Wrong CrossRefMap"); 460 check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1, 461 "Wrong CrossRefMap::count()"); 462 463 ValueIt it = map.beginValue(); 464 check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' && 465 it == map.endValue(), "Wrong value iterator"); 466 373 467 map.set(n2, 'A'); 468 469 check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A', 470 "Wrong CrossRefMap"); 471 check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap"); 472 check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap"); 473 check(map('C') == INVALID && map.inverse()['C'] == INVALID, 474 "Wrong CrossRefMap"); 475 check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0, 476 "Wrong CrossRefMap::count()"); 477 478 it = map.beginValue(); 479 check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' && 480 it == map.endValue(), "Wrong value iterator"); 481 374 482 map.set(n0, 'C'); 375 483 376 484 check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A', … … 378 486 check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap"); 379 487 check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap"); 380 488 check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap"); 489 check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1, 490 "Wrong CrossRefMap::count()"); 381 491 382 ValueItit = map.beginValue();492 it = map.beginValue(); 383 493 check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' && 384 494 it == map.endValue(), "Wrong value iterator"); 385 495 }