//
//  emit.hpp
//  aho-corasick
//
//  Created by chenguanglv on 15/12/19.
//  Copyright © 2015年 ibrain. All rights reserved.
//

#ifndef emit_h
#define emit_h

#include "typedef.hpp"

namespace ac
{
    template<typename T,typename D>
    class EmitResult
    {
        typedef typename ACDef<T>::ACData EmitACData;
    public:
        EmitResult() : _begin(0),_end(0),_userdata(nullptr){}
        
        EmitResult(size_t begin,size_t end,EmitACData data,D* userdata)
        : _begin(begin)
        , _end(end)
        , _data(data)
        , _userdata(userdata){}
        
        ~EmitResult(){}
        
        bool empty() const
        {
            return (_begin == _end);
        }
        
        const EmitACData& getEmitResult() const
        {
            return _data;
        }
        
        D* getUserData() const
        {
            return _userdata;
        }
        
        size_t getBegin() const
        {
            return _begin;
        }
        
        size_t getEnd() const
        {
            return _end;
        }
        
        bool operator < (const EmitResult<T,D>& emitResult) const
        {
            return _data < emitResult._data;
        }
        
        void setEmitResult(EmitACData& data)
        {
            _data = data;
        }
        
        void setUserData(D *userdata)
        {
            _userdata = userdata;
        }
        
        void setBegin(size_t begin)
        {
            _begin = begin;
        }
        
        void setEnd(size_t end)
        {
            _end = end;
        }
        
#ifdef USE_UTF8_TABLE
        size_t getCharacterCount() const
        {
            return _characterCount;
        }
        
        void setCharacterCount(size_t count)
        {
            _characterCount = count;
        }
#endif
        
    private:
        size_t _begin;
        size_t _end;
#ifdef USE_UTF8_TABLE
        size_t _characterCount;
#endif
        EmitACData _data;
        D* _userdata;
    };
}


#endif /* emit_h */
