From: <den...@us...> - 2010-09-12 16:23:54
|
Revision: 320 http://stdair.svn.sourceforge.net/stdair/?rev=320&view=rev Author: denis_arnaud Date: 2010-09-12 16:23:47 +0000 (Sun, 12 Sep 2010) Log Message: ----------- [Test] Added a test sub-directory for Boost.Intrusive-based architecture. Modified Paths: -------------- trunk/stdair/test/archi_intru/FlightDate.hpp trunk/stdair/test/archi_intru/Makefile.am trunk/stdair/test/archi_intru/archi.cpp trunk/stdair/test/archi_intru/sources.mk Added Paths: ----------- trunk/stdair/test/archi_intru/TestManager.cpp trunk/stdair/test/archi_intru/TestManager.hpp Modified: trunk/stdair/test/archi_intru/FlightDate.hpp =================================================================== --- trunk/stdair/test/archi_intru/FlightDate.hpp 2010-09-12 14:43:43 UTC (rev 319) +++ trunk/stdair/test/archi_intru/FlightDate.hpp 2010-09-12 16:23:47 UTC (rev 320) @@ -53,12 +53,17 @@ /** Get a string describing the key. */ const std::string describeKey() const { return _key; } }; + + // ///////////////// Type definitions ///////////// + /** Standard (STL) list (vector) of BOM FlightDate objects (pointers). */ + typedef std::vector<stdair::FlightDate*> FlightDateVector_T; - /** List of child-type FlightDate objects. */ + /** (Boost.Intrusive) List of child-type FlightDate objects. */ typedef bi::member_hook <FlightDate, bi::list_member_hook<>, &FlightDate::_childListHook> FlightDateListMemberOption; typedef bi::list<FlightDate, FlightDateListMemberOption> FlightDateChildList; + /** (Boost.Intrusive) Set of child-type FlightDate objects. */ typedef bi::member_hook <FlightDate, bi::set_member_hook<>, &FlightDate::_childSetHook> FlightDateSetMemberOption; typedef bi::set<FlightDate, FlightDateSetMemberOption> FlightDateChildSet; Modified: trunk/stdair/test/archi_intru/Makefile.am =================================================================== --- trunk/stdair/test/archi_intru/Makefile.am 2010-09-12 14:43:43 UTC (rev 319) +++ trunk/stdair/test/archi_intru/Makefile.am 2010-09-12 16:23:47 UTC (rev 320) @@ -10,12 +10,22 @@ EXTRA_DIST = ## +## +# Test library +noinst_LTLIBRARIES = libarchiintru.la + +libarchiintru_la_SOURCES = $(archi_intru_h_sources) $(archi_intru_cc_sources) +libarchiintru_la_CXXFLAGS = $(BOOST_CFLAGS) +libarchiintru_la_LDFLAGS = $(BOOST_LIBS) + +## +# Test binary check_PROGRAMS = archi #TESTS = $(check_PROGRAMS) TESTS = XFAIL_TESTS = #IndexBuildingTestSuite -archi_SOURCES = $(archi_intru_h_sources) $(archi_intru_cc_sources) -archi_CXXFLAGS = $(BOOST_CFLAGS) -archi_LDFLAGS = $(BOOST_LIBS) +archi_SOURCES = archi.cpp +archi_CXXFLAGS = archi_LDADD = +archi_LDFLAGS = $(top_builddir)/test/archi_intru/libarchiintru.la Added: trunk/stdair/test/archi_intru/TestManager.cpp =================================================================== Added: trunk/stdair/test/archi_intru/TestManager.hpp =================================================================== --- trunk/stdair/test/archi_intru/TestManager.hpp (rev 0) +++ trunk/stdair/test/archi_intru/TestManager.hpp 2010-09-12 16:23:47 UTC (rev 320) @@ -0,0 +1,172 @@ +#ifndef __LATUS_STDAIR_TST_TESTMANAGER_HPP +#define __LATUS_STDAIR_TST_TESTMANAGER_HPP + +// ////////////////////////////////////////////////////////////////////// +// Import section +// ////////////////////////////////////////////////////////////////////// +// STL +#include <cassert> +#include <iostream> +#include <sstream> +#include <string> +#include <vector> +// Boost +#include <boost/intrusive/list.hpp> +// Local +#include <test/archi_intru/FlightDate.hpp> +//#include <test/archi_intru/FacRelationShipRoot.hpp> + +/** Alias for the boost::intrusive namespace. */ +namespace bi = boost::intrusive; + +/** Class wrapping test functions. */ +class TestManager { +public: + /** Destructor. */ + ~TestManager() { clean(); } + +public: + /** Fill the standard (STL) vector. */ + void initStandard() { + // Create several FlightDate objects, each one with a different value + for (int idx = 0; idx < 100; ++idx) { + stdair::FlightDate* lFlightDate_ptr = new stdair::FlightDate (idx); + assert (lFlightDate_ptr != NULL); + + _flightDateVector.push_back (lFlightDate_ptr); + } + } + + /** Fill the (Boost) Intrusive list (and set). */ + void initIntrusive() { + // Now insert them in the same order as in vector in the member hook list + for (stdair::FlightDateVector_T::iterator itFlight (_flightDateVector.begin()), + itend (_flightDateVector.end()); itFlight != itend; ++itFlight) { + stdair::FlightDate* lFlightDate_ptr = *itFlight; + assert (lFlightDate_ptr != NULL); + + _flightDateChildList.push_back (*lFlightDate_ptr); + _flightDateChildSet.insert (*lFlightDate_ptr); + } + + // DEBUG + /* + std::cout << "Size of the Boost.Intrusive list of FlightDate objects: " + << lFlightDateChildList.size() << std::endl; + std::cout << "Size of the Boost.Intrusive set of FlightDate objects: " + << lFlightDateChildSet.size() << std::endl; + */ + } + + /** Some memory cleaning. + <br>Note: the FlightDate objects cannot be simply deleted (with the + delete opearator). + <br>See also, for more details: + - http://www.boost.org/doc/libs/1_44_0/doc/html/intrusive/usage.html#intrusive.usage.usage_lifetime + - http://www.boost.org/doc/libs/1_44_0/doc/html/intrusive/erasing_and_disposing.html + <br>First, clear simply all the Boost.Intrusive containers but one. Then, + clear the last Boost.Intrusive container while deleting the corresponding + hooked objects. + */ + void clean() { + _flightDateChildSet.clear(); + _flightDateChildList.clear_and_dispose (delete_disposer<stdair::FlightDate>()); + } + + /** Optimized search functions */ + stdair::FlightDate* getFromSet (const std::string& iKey) { + stdair::FlightDate* oFlightDate_ptr = NULL; + stdair::FlightDateChildSet::iterator itFlight = + _flightDateChildSet.find (iKey, StrExpComp<stdair::FlightDate>()); + if (itFlight == _flightDateChildSet.end()) { + return oFlightDate_ptr; + } + oFlightDate_ptr = &*itFlight; + return oFlightDate_ptr; + } + + /** Test (Boost) Intrusive lists. */ + bool testIntrusiveList() { + bool oTestSuccessfull = true; + + stdair::FlightDateChildList::iterator mit (_flightDateChildList.begin()), + mitend (_flightDateChildList.end()); + stdair::FlightDateVector_T::iterator itFlight (_flightDateVector.begin()), + itend (_flightDateVector.end()); + + // Test the objects inserted in the member hook list + for (itFlight = _flightDateVector.begin(); + itFlight != itend; ++itFlight, ++mit) { + stdair::FlightDate* lFlightDate_ptr = *itFlight; + assert (lFlightDate_ptr != NULL); + + if (&*mit != lFlightDate_ptr) { + oTestSuccessfull = false; + break; + } + } + + return oTestSuccessfull; + } + + /** Test (Boost) Intrusive iterator_to(). */ + bool testIntrusiveIteratorTo() { + bool oTestSuccessfull = true; + + stdair::FlightDateChildList::iterator itChild(_flightDateChildList.begin()); + for (int idx = 0; idx < 100; ++idx, ++itChild) { + stdair::FlightDate* lFlightDate_ptr = _flightDateVector.at(idx); + assert (lFlightDate_ptr != NULL); + + if (_flightDateChildList.iterator_to (*lFlightDate_ptr) != itChild || + stdair::FlightDateChildList::s_iterator_to(*lFlightDate_ptr) != itChild) { + oTestSuccessfull = false; + break; + } + } + + return oTestSuccessfull; + } + + /** Test (Boost) Intrusive sets. */ + bool testIntrusiveSets() { + bool oTestSuccessfull = true; + + stdair::FlightDateChildSet::iterator itChild (_flightDateChildSet.begin()), + itChildEnd (_flightDateChildSet.end()); + for (; itChild != itChildEnd; ++itChild) { + const stdair::FlightDate& lFlightDate = *itChild; + + const std::string& lKey = lFlightDate.getKey(); + stdair::FlightDate* retrievedFlightDate_ptr = getFromSet (lKey); + + // DEBUG + /* + std::cout << "Key = '" << lKey << "', itFD = " + << &lFlightDate << ", retrieved: " << retrievedFlightDate_ptr + << std::endl; + */ + + if (retrievedFlightDate_ptr == NULL || + _flightDateChildSet.iterator_to (lFlightDate) != itChild || + _flightDateChildSet.iterator_to (*retrievedFlightDate_ptr) != itChild || + stdair::FlightDateChildSet::s_iterator_to (lFlightDate) != itChild || + stdair::FlightDateChildSet::s_iterator_to(*retrievedFlightDate_ptr) != itChild) { + oTestSuccessfull = false; + break; + } + } + + return oTestSuccessfull; + } + +public: + // Standard STL container + stdair::FlightDateVector_T _flightDateVector; + + // (Boost) Intrusive container + stdair::FlightDateChildList _flightDateChildList; + stdair::FlightDateChildSet _flightDateChildSet; +}; + +#endif // __LATUS_STDAIR_TST_TESTMANAGER_HPP Modified: trunk/stdair/test/archi_intru/archi.cpp =================================================================== --- trunk/stdair/test/archi_intru/archi.cpp 2010-09-12 14:43:43 UTC (rev 319) +++ trunk/stdair/test/archi_intru/archi.cpp 2010-09-12 16:23:47 UTC (rev 320) @@ -7,26 +7,11 @@ // Boost #include <boost/intrusive/list.hpp> // Local -#include <test/archi_intru/FlightDate.hpp> -//#include <test/archi_intru/FacRelationShipRoot.hpp> +#include <test/archi_intru/TestManager.hpp> /** Alias for the boost::intrusive namespace. */ namespace bi = boost::intrusive; - -// Optimized search functions -stdair::FlightDate* getFromSet(const std::string& iKey, - stdair::FlightDateChildSet& ioFlightDateChildSet) { - stdair::FlightDate* oFlightDate_ptr = NULL; - stdair::FlightDateChildSet::iterator itFlight = - ioFlightDateChildSet.find (iKey, StrExpComp<stdair::FlightDate>()); - if (itFlight == ioFlightDateChildSet.end()) { - return oFlightDate_ptr; - } - oFlightDate_ptr = &*itFlight; - return oFlightDate_ptr; -} - // /////////////////////////// M A I N ///////////////////////// /** Main. <br>Run with the following command: @@ -37,115 +22,21 @@ int main (int argc, char* argv[]) { // - typedef std::vector<stdair::FlightDate*> FlightDateVector_T; - - // Standard STL container - FlightDateVector_T lFlightDateVector; + TestManager lTestManager; - // Create several FlightDate objects, each one with a different value - for (int idx = 0; idx < 100; ++idx) { - stdair::FlightDate* lFlightDate_ptr = new stdair::FlightDate (idx); - assert (lFlightDate_ptr != NULL); - - lFlightDateVector.push_back (lFlightDate_ptr); - } + // Fill the standard (STL) vector + lTestManager.initStandard(); - // (Boost) Intrusive container - stdair::FlightDateChildList lFlightDateChildList; - stdair::FlightDateChildSet lFlightDateChildSet; - - // Now insert them in the same order as in vector in the member hook list - for (FlightDateVector_T::iterator itFlight (lFlightDateVector.begin()), - itend (lFlightDateVector.end()); itFlight != itend; ++itFlight) { - stdair::FlightDate* lFlightDate_ptr = *itFlight; - assert (lFlightDate_ptr != NULL); - - lFlightDateChildList.push_back (*lFlightDate_ptr); - lFlightDateChildSet.insert (*lFlightDate_ptr); - } - - // DEBUG - /* - std::cout << "Size of the Boost.Intrusive list of FlightDate objects: " - << lFlightDateChildList.size() << std::endl; - std::cout << "Size of the Boost.Intrusive set of FlightDate objects: " - << lFlightDateChildSet.size() << std::endl; - */ - + lTestManager.initIntrusive(); + // Now test lists - { - stdair::FlightDateChildList::iterator mit (lFlightDateChildList.begin()), - mitend (lFlightDateChildList.end()); - FlightDateVector_T::iterator itFlight (lFlightDateVector.begin()), - itend (lFlightDateVector.end()); - - // Test the objects inserted in the member hook list - for (itFlight = lFlightDateVector.begin(); - itFlight != itend; ++itFlight, ++mit) { - stdair::FlightDate* lFlightDate_ptr = *itFlight; - assert (lFlightDate_ptr != NULL); - - if (&*mit != lFlightDate_ptr) { - return 1; - } - } - } - + lTestManager.testIntrusiveList(); + // Now, test iterator_to() - { - stdair::FlightDateChildList::iterator itChild(lFlightDateChildList.begin()); - for (int idx = 0; idx < 100; ++idx, ++itChild) { - stdair::FlightDate* lFlightDate_ptr = lFlightDateVector.at(idx); - assert (lFlightDate_ptr != NULL); - - if (lFlightDateChildList.iterator_to (*lFlightDate_ptr) != itChild || - stdair::FlightDateChildList::s_iterator_to(*lFlightDate_ptr) != itChild) { - return 1; - } - } - } - + lTestManager.testIntrusiveIteratorTo(); + // Now, test sets - { - stdair::FlightDateChildSet::iterator itChild (lFlightDateChildSet.begin()), - itChildEnd (lFlightDateChildSet.end()); - for (; itChild != itChildEnd; ++itChild) { - const stdair::FlightDate& lFlightDate = *itChild; - - const std::string& lKey = lFlightDate.getKey(); - stdair::FlightDate* retrievedFlightDate_ptr = - getFromSet (lKey, lFlightDateChildSet); - - // DEBUG - /* - std::cout << "Key = '" << lKey << "', itFD = " - << &lFlightDate << ", retrieved: " << retrievedFlightDate_ptr - << std::endl; - */ - - if (retrievedFlightDate_ptr == NULL || - lFlightDateChildSet.iterator_to (lFlightDate) != itChild || - lFlightDateChildSet.iterator_to (*retrievedFlightDate_ptr) != itChild || - stdair::FlightDateChildSet::s_iterator_to (lFlightDate) != itChild || - stdair::FlightDateChildSet::s_iterator_to(*retrievedFlightDate_ptr) != itChild) { - return 1; - } - } - } + lTestManager.testIntrusiveSets(); - - /** Some memory cleaning. - <br>Note: the FlightDate objects cannot be simply deleted (with the - delete opearator). - <br>See also, for more details: - - http://www.boost.org/doc/libs/1_44_0/doc/html/intrusive/usage.html#intrusive.usage.usage_lifetime - - http://www.boost.org/doc/libs/1_44_0/doc/html/intrusive/erasing_and_disposing.html - <br>First, clear simply all the Boost.Intrusive containers but one. Then, - clear the last Boost.Intrusive container while deleting the corresponding - hooked objects. - */ - lFlightDateChildSet.clear(); - lFlightDateChildList.clear_and_dispose(delete_disposer<stdair::FlightDate>()); - return 0; } Modified: trunk/stdair/test/archi_intru/sources.mk =================================================================== --- trunk/stdair/test/archi_intru/sources.mk 2010-09-12 14:43:43 UTC (rev 319) +++ trunk/stdair/test/archi_intru/sources.mk 2010-09-12 16:23:47 UTC (rev 320) @@ -7,7 +7,8 @@ $(top_srcdir)/test/archi_intru/BomRoot.hpp \ $(top_srcdir)/test/archi_intru/FlightDate.hpp \ $(top_srcdir)/test/archi_intru/LegDate.hpp \ - $(top_srcdir)/test/archi_intru/SegmentDate.hpp + $(top_srcdir)/test/archi_intru/SegmentDate.hpp \ + $(top_srcdir)/test/archi_intru/TestManager.hpp archi_intru_cc_sources = \ $(top_srcdir)/test/archi_intru/FacSupervisor.cpp \ - $(top_srcdir)/test/archi_intru/archi.cpp + $(top_srcdir)/test/archi_intru/TestManager.cpp This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |