@@ -116,6 +116,16 @@ namespace SegmentReg {
116
116
return r.substr (t.start , t.end - t.start );
117
117
}
118
118
119
+ inline Spans spans (const T &seg) {
120
+ Spans res;
121
+ if (auto phrase = As<Phrase>(
122
+ Candidate::GetGenuineCandidate (seg.GetSelectedCandidate ()))) {
123
+ res.AddSpans (phrase->spans ());
124
+ }
125
+ res.AddSpan (seg.start , seg.end );
126
+ return res;
127
+ }
128
+
119
129
static const luaL_Reg funcs[] = {
120
130
{ " Segment" , WRAP (make) },
121
131
{ NULL , NULL },
@@ -129,6 +139,7 @@ namespace SegmentReg {
129
139
{ " get_candidate_at" , WRAPMEM (T::GetCandidateAt) },
130
140
{ " get_selected_candidate" , WRAPMEM (T::GetSelectedCandidate) },
131
141
{ " active_text" , WRAP (active_text) },
142
+ { " spans" , WRAP (spans) },
132
143
{ NULL , NULL },
133
144
};
134
145
@@ -265,6 +276,15 @@ namespace CandidateReg {
265
276
return false ;
266
277
};
267
278
279
+ Spans spans (const an<Candidate> &cand) {
280
+ if (auto phrase = As<Phrase>(Candidate::GetGenuineCandidate (cand))) {
281
+ return phrase->spans ();
282
+ }
283
+ Spans spans;
284
+ spans.AddSpan (cand->start (), cand->end ());
285
+ return spans;
286
+ }
287
+
268
288
template <class OT >
269
289
an<OT> candidate_to_ (an<T> t) {
270
290
return std::dynamic_pointer_cast<OT>(t);
@@ -286,6 +306,7 @@ namespace CandidateReg {
286
306
{ " to_phrase" , WRAP (candidate_to_<Phrase>)},
287
307
{ " to_sentence" , WRAP (candidate_to_<Sentence>)},
288
308
{ " append" , WRAP (append)},
309
+ { " spans" , WRAP (spans)},
289
310
{ NULL , NULL },
290
311
};
291
312
@@ -853,6 +874,18 @@ namespace CompositionReg {
853
874
return t.empty ();
854
875
}
855
876
877
+ vector<Segment> get_segments (T &t) {
878
+ return t;
879
+ }
880
+
881
+ Spans spans (const T &t) {
882
+ Spans spans;
883
+ for (const auto &seg : t) {
884
+ spans.AddSpans ( SegmentReg::spans (seg) );
885
+ }
886
+ return spans;
887
+ }
888
+
856
889
static const luaL_Reg funcs[] = {
857
890
{ NULL , NULL },
858
891
};
@@ -866,6 +899,7 @@ namespace CompositionReg {
866
899
{ " has_finished_composition" , WRAPMEM (T::HasFinishedComposition) },
867
900
{ " get_prompt" , WRAPMEM (T::GetPrompt) },
868
901
{ " toSegmentation" , WRAP (toSegmentation) },
902
+ { " spans" , WRAP (spans)},
869
903
{ NULL , NULL },
870
904
};
871
905
@@ -2061,6 +2095,37 @@ namespace SpansReg {
2061
2095
return spans.Count (start, end);
2062
2096
}
2063
2097
2098
+ vector<size_t > get_vertices (const T &spans) {
2099
+ vector<size_t > res;
2100
+ size_t end = spans.end ();
2101
+ for (size_t stop = spans.start (); ; stop = spans.NextStop (stop)) {
2102
+ if (spans.HasVertex (stop)) {
2103
+ res.push_back (stop);
2104
+ }
2105
+ if (stop == end) {
2106
+ break ;
2107
+ }
2108
+ }
2109
+ return res;
2110
+ }
2111
+
2112
+ int raw_set_vertices (lua_State *L) {
2113
+ C_State C;
2114
+ auto &spans = LuaType<Spans &>::todata (L, 1 );
2115
+ if (lua_istable (L, 2 )) {
2116
+ spans.Clear ();
2117
+ for (auto vertex : LuaType<vector<int >>::todata (L, 2 , &C)) {
2118
+ if (vertex >=0 ) {
2119
+ spans.AddVertex (vertex);
2120
+ }
2121
+ }
2122
+ }
2123
+ else {
2124
+ luaL_error (L, " bad argument #2 to set_vertices (table expected, got %s)" , lua_typename (L, 2 ));
2125
+ }
2126
+ return 0 ;
2127
+ }
2128
+
2064
2129
static const luaL_Reg funcs[] = {
2065
2130
{ " Spans" , WRAP (make) },
2066
2131
{ NULL , NULL },
@@ -2069,21 +2134,25 @@ namespace SpansReg {
2069
2134
static const luaL_Reg methods[] = {
2070
2135
{ " add_span" , WRAPMEM (T, AddSpan) },
2071
2136
{ " add_spans" , WRAPMEM (T, AddSpans) },
2137
+ { " add_vertex" , WRAPMEM (T, AddVertex)},
2072
2138
{ " previous_stop" , WRAPMEM (T, PreviousStop) },
2073
2139
{ " next_stop" , WRAPMEM (T, NextStop) },
2074
2140
{ " has_vertex" , WRAPMEM (T, HasVertex) },
2075
2141
{ " count_between" , WRAP (count_between) },
2142
+ { " clear" , WRAPMEM (T, Clear) },
2076
2143
{ NULL , NULL },
2077
2144
};
2078
2145
2079
2146
static const luaL_Reg vars_get[] = {
2080
2147
{ " _start" , WRAPMEM (T, start) },
2081
2148
{ " _end" , WRAPMEM (T, end) },
2082
2149
{ " count" , WRAP (count) },
2150
+ { " vertices" , WRAP (get_vertices)},
2083
2151
{ NULL , NULL },
2084
2152
};
2085
2153
2086
2154
static const luaL_Reg vars_set[] = {
2155
+ { " vertices" , (raw_set_vertices)},
2087
2156
{ NULL , NULL },
2088
2157
};
2089
2158
} // namespace SpansReg
0 commit comments