Skip to content

Commit b0f537c

Browse files
author
Christian Schulte
committed
Finally, engines have a common baseclass
git-svn-id: file:///Users/tack/GecodeGitMigration/gecode-svn-mirror/gecode/trunk@14437 e85b7adc-8362-4630-8c63-7469d557c915
1 parent 42eecca commit b0f537c

File tree

5 files changed

+63
-93
lines changed

5 files changed

+63
-93
lines changed

gecode/search.hh

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -635,16 +635,34 @@ namespace Gecode {
635635
namespace Gecode { namespace Search {
636636

637637
/// Base-class for search engines
638+
template<class T>
638639
class EngineBase {
639640
template<template<class>class,class> friend class ::Gecode::RBS;
640641
protected:
641642
/// The actual search engine
642-
Search::Engine* e;
643+
Engine* e;
643644
/// Constructor
644-
EngineBase(Search::Engine* e = NULL);
645+
EngineBase(Engine* e = NULL);
645646
public:
647+
/// Return next solution (NULL, if none exists or search has been stopped)
648+
virtual T* next(void);
649+
/// Return statistics
650+
virtual Statistics statistics(void) const;
651+
/// Check whether engine has been stopped
652+
virtual bool stopped(void) const;
653+
/// Reset engine to restart at space \a s (does nothing)
654+
virtual void reset(Space* s);
655+
/// Return no-goods (the no-goods are empty)
656+
virtual NoGoods& nogoods(void);
646657
/// Destructor
647-
~EngineBase(void);
658+
virtual ~EngineBase(void);
659+
/// \name Memory management
660+
//@{
661+
/// Allocate memory from heap
662+
static void* operator new(size_t s);
663+
/// Free memory allocated from heap
664+
static void operator delete(void* p);
665+
//@}
648666
};
649667

650668
}}
@@ -662,18 +680,10 @@ namespace Gecode {
662680
* \ingroup TaskModelSearch
663681
*/
664682
template<class T>
665-
class DFS : public Search::EngineBase {
683+
class DFS : public Search::EngineBase<T> {
666684
public:
667685
/// Initialize search engine for space \a s with options \a o
668686
DFS(T* s, const Search::Options& o=Search::Options::def);
669-
/// Return next solution (NULL, if none exists or search has been stopped)
670-
T* next(void);
671-
/// Return statistics
672-
Search::Statistics statistics(void) const;
673-
/// Check whether engine has been stopped
674-
bool stopped(void) const;
675-
/// Return no-goods
676-
NoGoods& nogoods(void);
677687
};
678688

679689
/// Invoke depth-first search engine for subclass \a T of space \a s with options \a o
@@ -698,7 +708,7 @@ namespace Gecode {
698708
* \ingroup TaskModelSearch
699709
*/
700710
template<class T>
701-
class BAB : public Search::EngineBase {
711+
class BAB : public Search::EngineBase<T> {
702712
public:
703713
/// Initialize engine for space \a s and options \a o
704714
BAB(T* s, const Search::Options& o=Search::Options::def);
@@ -752,28 +762,22 @@ namespace Gecode {
752762
* \ingroup TaskModelSearch
753763
*/
754764
template<template<class> class E, class T>
755-
class RBS : public Search::EngineBase {
765+
class RBS : public Search::EngineBase<T> {
756766
public:
757767
/// Initialize engine for space \a s and options \a o
758768
RBS(T* s, const Search::Options& o);
759-
/// Return next solution (NULL, if non exists or search has been stopped)
760-
T* next(void);
761-
/// Return statistics
762-
Search::Statistics statistics(void) const;
763-
/// Check whether engine has been stopped
764-
bool stopped(void) const;
765769
};
766770

767771
/**
768772
* \brief Perform restart-based search
769773
*
770774
* The engine uses the Cutoff sequence supplied in the options \a o to
771-
* periodically restart the search of an engine of type \a E.
775+
* periodically restart the search of engine \a E.
772776
*
773777
* The class \a T can implement member functions
774-
* \code virtual void master(unsigned long int i, const Space* s) \endcode
778+
* \code virtual bool master(const CRI& cri) \endcode
775779
* and
776-
* \code virtual void slave(unsigned long int i, const Space* s) \endcode
780+
* \code virtual bool slave(const CRI& cri) \endcode
777781
*
778782
* Whenever exploration restarts or a solution is found, the
779783
* engine executes the functions on the master and slave

gecode/search/bab.hpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,31 +51,6 @@ namespace Gecode {
5151
BAB<T>::BAB(T* s, const Search::Options& o)
5252
: EngineBase(Search::bab(s,o)) {}
5353

54-
template<class T>
55-
forceinline T*
56-
BAB<T>::next(void) {
57-
return dynamic_cast<T*>(e->next());
58-
}
59-
60-
template<class T>
61-
forceinline Search::Statistics
62-
BAB<T>::statistics(void) const {
63-
return e->statistics();
64-
}
65-
66-
template<class T>
67-
forceinline bool
68-
BAB<T>::stopped(void) const {
69-
return e->stopped();
70-
}
71-
72-
template<class T>
73-
forceinline NoGoods&
74-
BAB<T>::nogoods(void) {
75-
return e->nogoods();
76-
}
77-
78-
7954
template<class T>
8055
T*
8156
bab(T* s, const Search::Options& o) {

gecode/search/dfs.hpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,6 @@ namespace Gecode {
4747
DFS<T>::DFS(T* s, const Search::Options& o)
4848
: EngineBase(Search::dfs(s,o)) {}
4949

50-
template<class T>
51-
forceinline T*
52-
DFS<T>::next(void) {
53-
return dynamic_cast<T*>(e->next());
54-
}
55-
56-
template<class T>
57-
forceinline Search::Statistics
58-
DFS<T>::statistics(void) const {
59-
return e->statistics();
60-
}
61-
62-
template<class T>
63-
forceinline bool
64-
DFS<T>::stopped(void) const {
65-
return e->stopped();
66-
}
67-
68-
template<class T>
69-
forceinline NoGoods&
70-
DFS<T>::nogoods(void) {
71-
return e->nogoods();
72-
}
73-
74-
7550
template<class T>
7651
forceinline T*
7752
dfs(T* s, const Search::Options& o) {

gecode/search/engine-base.hpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,45 @@
4141

4242
namespace Gecode { namespace Search {
4343

44+
template<class T>
4445
forceinline
45-
EngineBase::EngineBase(Search::Engine* e0)
46+
EngineBase<T>::EngineBase(Engine* e0)
4647
: e(e0) {}
48+
template<class T>
49+
forceinline T*
50+
EngineBase<T>::next(void) {
51+
return dynamic_cast<T*>(e->next());
52+
}
53+
template<class T>
54+
forceinline Statistics
55+
EngineBase<T>::statistics(void) const {
56+
return e->statistics();
57+
}
58+
template<class T>
59+
forceinline bool
60+
EngineBase<T>::stopped(void) const {
61+
return e->stopped();
62+
}
63+
template<class T>
64+
forceinline NoGoods&
65+
EngineBase<T>::nogoods(void) {
66+
return e->nogoods();
67+
}
68+
template<class T>
4769
forceinline
48-
EngineBase::~EngineBase(void) {
70+
EngineBase<T>::~EngineBase(void) {
4971
delete e;
5072
}
73+
template<class T>
74+
forceinline void*
75+
EngineBase<T>::operator new(size_t s) {
76+
return heap.ralloc(s);
77+
}
78+
template<class T>
79+
forceinline void
80+
EngineBase<T>::operator delete(void* p) {
81+
heap.rfree(p);
82+
}
5183

5284
}}
5385

gecode/search/rbs.hpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
22
/*
33
* Main authors:
4+
* Christian Schulte <[email protected]>
45
* Guido Tack <[email protected]>
56
*
67
* Copyright:
8+
* Christian Schulte, 2014
79
* Guido Tack, 2012
810
*
911
* Last modified:
@@ -71,24 +73,6 @@ namespace Gecode {
7173
e = new Search::Meta::RBS(master,rs,ee,m_opt);
7274
}
7375

74-
template<template<class> class E, class T>
75-
forceinline T*
76-
RBS<E,T>::next(void) {
77-
return dynamic_cast<T*>(e->next());
78-
}
79-
80-
template<template<class> class E, class T>
81-
forceinline Search::Statistics
82-
RBS<E,T>::statistics(void) const {
83-
return e->statistics();
84-
}
85-
86-
template<template<class> class E, class T>
87-
forceinline bool
88-
RBS<E,T>::stopped(void) const {
89-
return e->stopped();
90-
}
91-
9276

9377
template<template<class> class E, class T>
9478
forceinline T*

0 commit comments

Comments
 (0)