9af15f192b4184f5e13682d0ea70f27cd2990d01
[platform/core/uifw/ise-engine-sunpinyin.git] / src / pinyin / segmentor.h
1 // -*- mode: c++ -*-
2 /*
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4  *
5  * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
6  *
7  * The contents of this file are subject to the terms of either the GNU Lesser
8  * General Public License Version 2.1 only ("LGPL") or the Common Development and
9  * Distribution License ("CDDL")(collectively, the "License"). You may not use this
10  * file except in compliance with the License. You can obtain a copy of the CDDL at
11  * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
12  * http://www.opensource.org/licenses/lgpl-license.php. See the License for the
13  * specific language governing permissions and limitations under the License. When
14  * distributing the software, include this License Header Notice in each file and
15  * include the full text of the License in the License file as well as the
16  * following notice:
17  *
18  * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
19  * (CDDL)
20  * For Covered Software in this distribution, this License shall be governed by the
21  * laws of the State of California (excluding conflict-of-law provisions).
22  * Any litigation relating to this License shall be subject to the jurisdiction of
23  * the Federal Courts of the Northern District of California and the state courts
24  * of the State of California, with venue lying in Santa Clara County, California.
25  *
26  * Contributor(s):
27  *
28  * If you wish your version of this file to be governed by only the CDDL or only
29  * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
30  * include this software in this distribution under the [CDDL or LGPL Version 2.1]
31  * license." If you don't indicate a single choice of license, a recipient has the
32  * option to distribute your version of this file under either the CDDL or the LGPL
33  * Version 2.1, or to extend the choice of license to its licensees as provided
34  * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
35  * Version 2 license, then the option applies only if the new code is made subject
36  * to such option by the copyright holder.
37  */
38
39 #ifndef SUNPY_SEGMENTOR_H
40 #define SUNPY_SEGMENTOR_H
41
42 #include "portability.h"
43 #include "syllable.h"
44 #include <vector>
45
46 struct IPySegmentor {
47     enum ESegmentType
48     { SYLLABLE, SYLLABLE_SEP, INVALID, STRING };
49
50     struct TSegment {
51         TSegment (ESegmentType type = SYLLABLE) : m_type(type),
52                                                   m_inner_fuzzy(0) {}
53         TSegment (unsigned syllable,
54                   unsigned start,
55                   unsigned length,
56                   ESegmentType type = SYLLABLE)
57             : m_start(start), m_len(length), m_type(type), m_inner_fuzzy(0)
58         { m_syllables.push_back(syllable); }
59
60         bool operator <(const TSegment& other) const {
61             if (m_start < other.m_start)
62                 return true;
63
64             if (m_start == other.m_start)
65                 return m_len < m_len;
66
67             return false;
68         }
69
70         // if segment is a STRING type, m_syllables may contain the string buffer without the '\0'
71         std::vector<unsigned>           m_syllables;
72         std::vector<unsigned>           m_fuzzy_syllables;
73         unsigned m_start        : 16;
74         unsigned m_len          : 8;
75         ESegmentType m_type         : 7;
76         bool m_inner_fuzzy  : 1;
77     };
78
79     // it requires the segments are sorted by its m_start field
80     typedef std::vector<TSegment>  TSegmentVec;
81
82     virtual ~IPySegmentor () {}
83     virtual TSegmentVec& getSegments(bool req_aux_segs = true) = 0;
84     virtual const wstring& getInputBuffer() = 0;
85     virtual const char* getSylSeps() = 0;
86
87     virtual unsigned push(unsigned ch) = 0;
88     virtual unsigned pop() = 0;
89     virtual unsigned insertAt(unsigned idx, unsigned ch) = 0;
90     virtual unsigned deleteAt(unsigned idx, bool backward = true) = 0;
91     virtual unsigned clear(unsigned from = 0) = 0;
92     virtual void     notify_best_segpath(std::vector<unsigned>& seg_path) {}
93
94     virtual unsigned updatedFrom() = 0;
95 };
96
97 #endif