diff --git a/libcorpus2/ann/annotatedsentence.cpp b/libcorpus2/ann/annotatedsentence.cpp index 327e9bad2be2d574c84d35e077ff1a088a0a861e..7203d85d7fa69b597f0de1168e0aec8bac78185e 100644 --- a/libcorpus2/ann/annotatedsentence.cpp +++ b/libcorpus2/ann/annotatedsentence.cpp @@ -29,20 +29,30 @@ Sentence::Ptr AnnotatedSentence::clone_shared() const boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence( const boost::shared_ptr<Sentence>& s) { - boost::shared_ptr<AnnotatedSentence> a = boost::make_shared<AnnotatedSentence>(); - foreach (Token* t, s->tokens()) { - a->append(t); + boost::shared_ptr<AnnotatedSentence> a; + a = boost::dynamic_pointer_cast<AnnotatedSentence>(s); + if (!a) { + a = boost::make_shared<AnnotatedSentence>(); + foreach (Token* t, s->tokens()) { + a->append(t); + } + s->release_tokens(); } - s->release_tokens(); return a; } boost::shared_ptr<AnnotatedSentence> AnnotatedSentence::wrap_sentence_clone( const boost::shared_ptr<Sentence>& s) { - boost::shared_ptr<AnnotatedSentence> a = boost::make_shared<AnnotatedSentence>(); - foreach (Token* t, s->tokens()) { - a->append(t->clone()); + boost::shared_ptr<AnnotatedSentence> a; + a = boost::dynamic_pointer_cast<AnnotatedSentence>(s); + if (!a) { + a = boost::make_shared<AnnotatedSentence>(); + foreach (Token* t, s->tokens()) { + a->append(t->clone()); + } + } else { + a = boost::dynamic_pointer_cast<AnnotatedSentence>(a->clone_shared()); } return a; }