Skip to content
Snippets Groups Projects
Select Git revision
  • 57af371c51c02c0473360988d6dfac08da817714
  • master default protected
  • develop protected
  • feat_remove_attr
  • python2.7
  • python3.8
6 results

sentence.h

Blame
  • user avatar
    ilor authored
    57af371c
    History
    sentence.h 1.85 KiB
    #ifndef PWRNLP_SENTENCE_H
    #define PWRNLP_SENTENCE_H
    
    #include <libpwrutils/foreach.h>
    #include <boost/range.hpp>
    #include <vector>
    
    namespace PwrNlp {
    
    	/**
    	 * A simple sentence wrapper template, a template not a plain class since
    	 * it is intended for use with various types of tokens.
    	 *
    	 * A sentence owns its Tokens.
    	 */
    	template<typename TT>
    	class SentenceTemplate : private boost::noncopyable
    	{
    	public:
    		/// Empty constructor
    		SentenceTemplate()
    			: tokens_()
    		{
    		}
    
    		/// Range constructor
    		template <typename T>
    		explicit SentenceTemplate(const T& range)
    			: tokens_()
    		{
    			std::copy(range.begin(), range.end(), std::back_inserter(tokens_));
    		}
    
    		SentenceTemplate* clone() const;
    
    		/// Destructor
    		~SentenceTemplate()
    		{
    			foreach (TT* t, tokens_) {
    				delete t;
    			}
    		}
    
    		bool empty() const {
    			return tokens_.empty();
    		}
    
    		/// Size accessor
    		size_t size() const {
    			return tokens_.size();
    		}
    
    		/// Token accessor
    		TT* operator[](size_t idx) {
    			return tokens_[idx];
    		}
    
    		/// Token accessor, const
    		const TT* operator[](size_t idx) const {
    			return tokens_[idx];
    		}
    
    		/// Underlying vector accessor, const
    		const std::vector<TT*>& tokens() const {
    			return tokens_;
    		}
    
    		/// Underlying vector accessor
    		std::vector<TT*>& tokens() {
    			return tokens_;
    		}
    
    		/// Helper function for appending tokens
    		void append(TT* t) {
    			tokens_.push_back(t);
    		}
    
    		/// convenience first token accessor
    		const TT* first_token() const {
    			assert(!tokens_.empty());
    			return tokens_[0];
    		}
    
    	private:
    		/// The tokens this sentence contains and owns
    		std::vector<TT*> tokens_;
    	};
    
    	template<class TT>
    	SentenceTemplate<TT>* SentenceTemplate<TT>::clone() const
    	{
    		SentenceTemplate<TT>* s = new SentenceTemplate<TT>;
    		foreach (const TT* t, tokens_) {
    			s->append(t->clone());
    		}
    		return s;
    	}
    
    } /* end ns PwrNlp */
    
    #endif // PWRNLP_SENTENCE_H