00001
00002 #include "ug_im_bitext.h"
00003
00004 namespace sapt
00005 {
00006 using namespace tpt;
00007 template<>
00008 SPTR<imBitext<L2R_Token<SimpleWordId> > >
00009 imBitext<L2R_Token<SimpleWordId> >::
00010 add(std::vector<std::string> const& s1,
00011 std::vector<std::string> const& s2,
00012 std::vector<std::string> const& aln) const
00013 {
00014 typedef L2R_Token<SimpleWordId> TKN;
00015 assert(s1.size() == s2.size() && s1.size() == aln.size());
00016
00017 #ifndef NDEBUG
00018 size_t first_new_snt = this->T1 ? this->T1->size() : 0;
00019 #endif
00020
00021 SPTR<imBitext<TKN> > ret;
00022 {
00023 boost::unique_lock<boost::shared_mutex> guard(m_lock);
00024 ret.reset(new imBitext<TKN>(*this));
00025 }
00026
00027
00028 boost::thread thread1(snt_adder<TKN>(s1,*ret->V1,ret->myT1,ret->myI1));
00029
00030 boost::thread thread2(snt_adder<TKN>(s2,*ret->V2,ret->myT2,ret->myI2));
00031 BOOST_FOREACH(std::string const& a, aln)
00032 {
00033 std::istringstream ibuf(a);
00034 std::ostringstream obuf;
00035 uint32_t row,col; char c;
00036 while (ibuf >> row >> c >> col)
00037 {
00038 UTIL_THROW_IF2(c != '-', "[" << HERE << "] "
00039 << "Error in alignment information:\n" << a);
00040 binwrite(obuf,row);
00041 binwrite(obuf,col);
00042 }
00043
00044
00045
00046 std::string foo = obuf.str();
00047 char const* x = foo.c_str();
00048 std::vector<char> v(x,x+foo.size());
00049 ret->myTx = append(ret->myTx, v);
00050 }
00051
00052 thread1.join();
00053 thread2.join();
00054
00055 ret->Tx = ret->myTx;
00056 ret->T1 = ret->myT1;
00057 ret->T2 = ret->myT2;
00058 ret->I1 = ret->myI1;
00059 ret->I2 = ret->myI2;
00060
00061 #ifndef NDEBUG
00062
00063 for (size_t i = first_new_snt; i < ret->T1->size(); ++i)
00064 {
00065 size_t slen1 = ret->T1->sntLen(i);
00066 size_t slen2 = ret->T2->sntLen(i);
00067 char const* p = ret->Tx->sntStart(i);
00068 char const* q = ret->Tx->sntEnd(i);
00069 size_t k;
00070 while (p < q)
00071 {
00072 p = binread(p,k);
00073 assert(p);
00074 assert(p < q);
00075 assert(k < slen1);
00076 p = binread(p,k);
00077 assert(p);
00078 assert(k < slen2);
00079 }
00080 }
00081 #endif
00082 return ret;
00083 }
00084
00085 }
00086