From eb0a8931eb835d8a23c939ef61867a08c19ebf6b Mon Sep 17 00:00:00 2001 From: graehl Date: Tue, 20 Jul 2010 00:11:45 +0000 Subject: Score::TimesEquals for vlad-mira, intrusive refcount for Score, shared_ptr compile fixes for decoder progs git-svn-id: https://ws10smt.googlecode.com/svn/trunk@331 ec762483-ff6d-05da-a07a-a48fb63a330f --- decoder/intrusive_refcount.hpp | 84 ++++++++++++++++++++++++++++++++++++++++++ decoder/oracle_bleu.h | 3 +- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100755 decoder/intrusive_refcount.hpp (limited to 'decoder') diff --git a/decoder/intrusive_refcount.hpp b/decoder/intrusive_refcount.hpp new file mode 100755 index 00000000..4a4b0187 --- /dev/null +++ b/decoder/intrusive_refcount.hpp @@ -0,0 +1,84 @@ +#ifndef GRAEHL__SHARED__INTRUSIVE_REFCOUNT_HPP +#define GRAEHL__SHARED__INTRUSIVE_REFCOUNT_HPP + +#include +#include +#include +#include + +/** usage: + struct mine : public boost::instrusive_refcount {}; + + boost::intrusive_ptr p(new mine()); +*/ + +namespace boost { +// note: the free functions need to be in boost namespace, OR namespace of involved type. this is the only way to do it. + +template +class intrusive_refcount; + +template +class atomic_intrusive_refcount; + +template +void intrusive_ptr_add_ref(intrusive_refcount* ptr) +{ + ++(ptr->refs); +} + +template +void intrusive_ptr_release(intrusive_refcount* ptr) +{ + if (!--(ptr->refs)) delete static_cast(ptr); +} + + +//WARNING: only 2^32 (unsigned) refs allowed. hope that's ok :) +template +class intrusive_refcount : boost::noncopyable +{ + protected: +// typedef intrusive_refcount pointed_type; + friend void intrusive_ptr_add_ref(intrusive_refcount* ptr); + friend void intrusive_ptr_release(intrusive_refcount* ptr); +// friend class intrusive_ptr; + + intrusive_refcount(): refs(0) {} + ~intrusive_refcount() { assert(refs==0); } + +private: + unsigned refs; +}; + + +template +void intrusive_ptr_add_ref(atomic_intrusive_refcount* ptr) +{ + ++(ptr->refs); +} + +template +void intrusive_ptr_release(atomic_intrusive_refcount* ptr) +{ + if(!--(ptr->refs)) delete static_cast(ptr); +} + +template +class atomic_intrusive_refcount : boost::noncopyable +{ + protected: + friend void intrusive_ptr_add_ref(atomic_intrusive_refcount* ptr); + friend void intrusive_ptr_release(atomic_intrusive_refcount* ptr); + + atomic_intrusive_refcount(): refs(0) {} + ~atomic_intrusive_refcount() { assert(refs==0); } + +private: + boost::detail::atomic_count refs; +}; + +} + + +#endif diff --git a/decoder/oracle_bleu.h b/decoder/oracle_bleu.h index 94548c18..2ccace61 100755 --- a/decoder/oracle_bleu.h +++ b/decoder/oracle_bleu.h @@ -231,7 +231,8 @@ struct OracleBleu { void IncludeLastScore(std::ostream *out=0) { double bleu_scale_ = doc_src_length * doc_score->ComputeScore(); - doc_score->PlusEquals(*sentscore, scale_oracle); + doc_score->PlusEquals(*sentscore); + doc_score->TimesEquals(scale_oracle); sentscore.reset(); doc_src_length = (doc_src_length + tmp_src_length) * scale_oracle; if (out) { -- cgit v1.2.3