From 88c026bb0fe839a87089b5b22fb4972243cfb41a Mon Sep 17 00:00:00 2001
From: ilor <kailoran@gmail.com>
Date: Tue, 12 Apr 2011 17:18:11 +0200
Subject: [PATCH] tweak AnnotatedSentence wrapping functions to behave more
 reasonably when passed a sentence tat already is an AnnotatedSentence

---
 libcorpus2/ann/annotatedsentence.cpp | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/libcorpus2/ann/annotatedsentence.cpp b/libcorpus2/ann/annotatedsentence.cpp
index 327e9ba..7203d85 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;
 }
-- 
GitLab