• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 #[diplomat::bridge]
6 #[diplomat::abi_rename = "icu4x_{0}_mv1"]
7 #[diplomat::attr(auto, namespace = "icu4x")]
8 pub mod ffi {
9     use alloc::boxed::Box;
10 
11     use crate::properties_sets::ffi::CodePointSetData;
12 
13     #[diplomat::opaque]
14     #[diplomat::rust_link(
15         icu::collections::codepointinvlist::CodePointInversionListBuilder,
16         Struct
17     )]
18     pub struct CodePointSetBuilder(
19         pub icu_collections::codepointinvlist::CodePointInversionListBuilder,
20     );
21 
22     impl CodePointSetBuilder {
23         /// Make a new set builder containing nothing
24         #[diplomat::rust_link(
25             icu::collections::codepointinvlist::CodePointInversionListBuilder::new,
26             FnInStruct
27         )]
28         #[diplomat::attr(auto, constructor)]
create() -> Box<Self>29         pub fn create() -> Box<Self> {
30             Box::new(Self(
31                 icu_collections::codepointinvlist::CodePointInversionListBuilder::new(),
32             ))
33         }
34 
35         /// Build this into a set
36         ///
37         /// This object is repopulated with an empty builder
38         #[diplomat::rust_link(
39             icu::collections::codepointinvlist::CodePointInversionListBuilder::build,
40             FnInStruct
41         )]
42         #[diplomat::rust_link(
43             icu::properties::CodePointSetData::from_code_point_inversion_list,
44             FnInStruct,
45             hidden
46         )]
build(&mut self) -> Box<CodePointSetData>47         pub fn build(&mut self) -> Box<CodePointSetData> {
48             let inner = core::mem::take(&mut self.0);
49             let built = inner.build();
50             let set = icu_properties::CodePointSetData::from_code_point_inversion_list(built);
51             Box::new(CodePointSetData(set))
52         }
53 
54         /// Complements this set
55         ///
56         /// (Elements in this set are removed and vice versa)
57         #[diplomat::rust_link(
58             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement,
59             FnInStruct
60         )]
complement(&mut self)61         pub fn complement(&mut self) {
62             self.0.complement()
63         }
64 
65         /// Returns whether this set is empty
66         #[diplomat::rust_link(
67             icu::collections::codepointinvlist::CodePointInversionListBuilder::is_empty,
68             FnInStruct
69         )]
70         #[diplomat::attr(auto, getter)]
is_empty(&self) -> bool71         pub fn is_empty(&self) -> bool {
72             self.0.is_empty()
73         }
74 
75         /// Add a single character to the set
76         #[diplomat::rust_link(
77             icu::collections::codepointinvlist::CodePointInversionListBuilder::add_char,
78             FnInStruct
79         )]
80         #[diplomat::rust_link(
81             icu::collections::codepointinvlist::CodePointInversionListBuilder::add32,
82             FnInStruct,
83             hidden
84         )]
add_char(&mut self, ch: DiplomatChar)85         pub fn add_char(&mut self, ch: DiplomatChar) {
86             self.0.add32(ch)
87         }
88 
89         /// Add an inclusive range of characters to the set
90         #[diplomat::rust_link(
91             icu::collections::codepointinvlist::CodePointInversionListBuilder::add_range,
92             FnInStruct
93         )]
94         #[diplomat::rust_link(
95             icu::collections::codepointinvlist::CodePointInversionListBuilder::add_range32,
96             FnInStruct,
97             hidden
98         )]
add_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar)99         pub fn add_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar) {
100             self.0.add_range32(start..=end)
101         }
102 
103         /// Add all elements that belong to the provided set to the set
104         #[diplomat::rust_link(
105             icu::collections::codepointinvlist::CodePointInversionListBuilder::add_set,
106             FnInStruct
107         )]
108         #[diplomat::rust_link(
109             icu::properties::CodePointSetData::as_code_point_inversion_list,
110             FnInStruct,
111             hidden
112         )]
113         #[diplomat::rust_link(
114             icu::properties::CodePointSetData::to_code_point_inversion_list,
115             FnInStruct,
116             hidden
117         )]
add_set(&mut self, data: &CodePointSetData)118         pub fn add_set(&mut self, data: &CodePointSetData) {
119             // This is a ZeroFrom and always cheap for a CPIL, may be expensive
120             // for other impls. In the future we can make this builder support multiple impls
121             // if we ever add them
122             let list = data.0.to_code_point_inversion_list();
123             self.0.add_set(&list);
124         }
125 
126         /// Remove a single character to the set
127         #[diplomat::rust_link(
128             icu::collections::codepointinvlist::CodePointInversionListBuilder::remove_char,
129             FnInStruct
130         )]
131         #[diplomat::rust_link(
132             icu::collections::codepointinvlist::CodePointInversionListBuilder::remove32,
133             FnInStruct,
134             hidden
135         )]
remove_char(&mut self, ch: DiplomatChar)136         pub fn remove_char(&mut self, ch: DiplomatChar) {
137             self.0.remove32(ch)
138         }
139 
140         /// Remove an inclusive range of characters from the set
141         #[diplomat::rust_link(
142             icu::collections::codepointinvlist::CodePointInversionListBuilder::remove_range,
143             FnInStruct
144         )]
145         #[diplomat::rust_link(
146             icu::collections::codepointinvlist::CodePointInversionListBuilder::remove_range32,
147             FnInStruct,
148             hidden
149         )]
remove_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar)150         pub fn remove_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar) {
151             self.0.remove_range32(start..=end)
152         }
153 
154         /// Remove all elements that belong to the provided set from the set
155         #[diplomat::rust_link(
156             icu::collections::codepointinvlist::CodePointInversionListBuilder::remove_set,
157             FnInStruct
158         )]
remove_set(&mut self, data: &CodePointSetData)159         pub fn remove_set(&mut self, data: &CodePointSetData) {
160             // (see comment in add_set)
161             let list = data.0.to_code_point_inversion_list();
162             self.0.remove_set(&list);
163         }
164 
165         /// Removes all elements from the set except a single character
166         #[diplomat::rust_link(
167             icu::collections::codepointinvlist::CodePointInversionListBuilder::retain_char,
168             FnInStruct
169         )]
170         #[diplomat::rust_link(
171             icu::collections::codepointinvlist::CodePointInversionListBuilder::retain32,
172             FnInStruct,
173             hidden
174         )]
retain_char(&mut self, ch: DiplomatChar)175         pub fn retain_char(&mut self, ch: DiplomatChar) {
176             self.0.retain32(ch)
177         }
178 
179         /// Removes all elements from the set except an inclusive range of characters f
180         #[diplomat::rust_link(
181             icu::collections::codepointinvlist::CodePointInversionListBuilder::retain_range,
182             FnInStruct
183         )]
184         #[diplomat::rust_link(
185             icu::collections::codepointinvlist::CodePointInversionListBuilder::retain_range32,
186             FnInStruct,
187             hidden
188         )]
retain_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar)189         pub fn retain_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar) {
190             self.0.retain_range32(start..=end)
191         }
192 
193         /// Removes all elements from the set except all elements in the provided set
194         #[diplomat::rust_link(
195             icu::collections::codepointinvlist::CodePointInversionListBuilder::retain_set,
196             FnInStruct
197         )]
retain_set(&mut self, data: &CodePointSetData)198         pub fn retain_set(&mut self, data: &CodePointSetData) {
199             // (see comment in add_set)
200             let list = data.0.to_code_point_inversion_list();
201             self.0.retain_set(&list);
202         }
203 
204         /// Complement a single character to the set
205         ///
206         /// (Characters which are in this set are removed and vice versa)
207         #[diplomat::rust_link(
208             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement_char,
209             FnInStruct
210         )]
211         #[diplomat::rust_link(
212             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement32,
213             FnInStruct,
214             hidden
215         )]
complement_char(&mut self, ch: DiplomatChar)216         pub fn complement_char(&mut self, ch: DiplomatChar) {
217             self.0.complement32(ch)
218         }
219 
220         /// Complement an inclusive range of characters from the set
221         ///
222         /// (Characters which are in this set are removed and vice versa)
223         #[diplomat::rust_link(
224             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement_range,
225             FnInStruct
226         )]
227         #[diplomat::rust_link(
228             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement_range32,
229             FnInStruct,
230             hidden
231         )]
complement_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar)232         pub fn complement_inclusive_range(&mut self, start: DiplomatChar, end: DiplomatChar) {
233             self.0.complement_range32(start..=end)
234         }
235 
236         /// Complement all elements that belong to the provided set from the set
237         ///
238         /// (Characters which are in this set are removed and vice versa)
239         #[diplomat::rust_link(
240             icu::collections::codepointinvlist::CodePointInversionListBuilder::complement_set,
241             FnInStruct
242         )]
complement_set(&mut self, data: &CodePointSetData)243         pub fn complement_set(&mut self, data: &CodePointSetData) {
244             // (see comment in add_set)
245             let list = data.0.to_code_point_inversion_list();
246             self.0.complement_set(&list);
247         }
248     }
249 }
250