summaryrefslogtreecommitdiff
path: root/vest
diff options
context:
space:
mode:
authorgraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-21 20:12:44 +0000
committergraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-21 20:12:44 +0000
commitf80891a7c4a2834efc476ce4d29cc6c438e567f0 (patch)
tree44256925313682feb6beb7bb701b2d4624de5f48 /vest
parent37043945bebecad62af028f76549245ba020884e (diff)
Score::Clone() via CRTP
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@360 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'vest')
-rw-r--r--vest/aer_scorer.cc2
-rw-r--r--vest/comb_scorer.cc2
-rw-r--r--vest/scorer.cc4
-rw-r--r--vest/scorer.h12
-rw-r--r--vest/ter.cc2
5 files changed, 17 insertions, 5 deletions
diff --git a/vest/aer_scorer.cc b/vest/aer_scorer.cc
index 81ffae76..25b58b5e 100644
--- a/vest/aer_scorer.cc
+++ b/vest/aer_scorer.cc
@@ -9,7 +9,7 @@
using namespace std;
-class AERScore : public Score {
+class AERScore : public ScoreBase<AERScore> {
friend class AERScorer;
public:
AERScore() : num_matches(), num_predicted(), num_in_ref() {}
diff --git a/vest/comb_scorer.cc b/vest/comb_scorer.cc
index a921aa4d..9fc37868 100644
--- a/vest/comb_scorer.cc
+++ b/vest/comb_scorer.cc
@@ -4,7 +4,7 @@
using namespace std;
-class BLEUTERCombinationScore : public Score {
+class BLEUTERCombinationScore : public ScoreBase<BLEUTERCombinationScore> {
friend class BLEUTERCombinationScorer;
public:
~BLEUTERCombinationScore();
diff --git a/vest/scorer.cc b/vest/scorer.cc
index 05269a3b..5671de38 100644
--- a/vest/scorer.cc
+++ b/vest/scorer.cc
@@ -87,7 +87,7 @@ float SentenceScorer::ComputeRefLength(const Sentence &hyp) const {
const std::string* SentenceScorer::GetSource() const { return NULL; }
-class SERScore : public Score {
+class SERScore : public ScoreBase<SERScore> {
friend class SERScorer;
public:
SERScore() : correct(0), total(0) {}
@@ -151,7 +151,7 @@ class SERScorer : public SentenceScorer {
vector<vector<WordID> > refs_;
};
-class BLEUScore : public Score {
+class BLEUScore : public ScoreBase<BLEUScore> {
friend class BLEUScorerBase;
public:
BLEUScore(int n) : correct_ngram_hit_counts(float(0),n), hyp_ngram_counts(float(0),n) {
diff --git a/vest/scorer.h b/vest/scorer.h
index 0d90f378..0c8b380f 100644
--- a/vest/scorer.h
+++ b/vest/scorer.h
@@ -46,6 +46,18 @@ class Score : public boost::intrusive_refcount<Score> {
virtual void Encode(std::string* out) const = 0;
static ScoreP GetZero(ScoreType type);
static ScoreP GetOne(ScoreType type);
+ virtual ScoreP Clone() const = 0;
+protected:
+ Score() { } // we define these explicitly because refcount is noncopyable
+ Score(Score const& o) { }
+};
+
+//TODO: make sure default copy ctors for score types do what we want.
+template <class Derived>
+struct ScoreBase : public Score {
+ ScoreP Clone() const {
+ return ScoreP(new Derived(dynamic_cast<Derived const&>(*this)));
+ }
};
class SentenceScorer {
diff --git a/vest/ter.cc b/vest/ter.cc
index 8c8494ad..cacc5b00 100644
--- a/vest/ter.cc
+++ b/vest/ter.cc
@@ -412,7 +412,7 @@ class TERScorerImpl {
}
};
-class TERScore : public Score {
+class TERScore : public ScoreBase<TERScore> {
friend class TERScorer;
public: