tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

script.rs (8776B)


      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::unstable::properties_iter::ffi::CodePointRangeIterator;
     12    use crate::unstable::properties_sets::ffi::CodePointSetData;
     13    #[cfg(feature = "buffer_provider")]
     14    use crate::unstable::{errors::ffi::DataError, provider::ffi::DataProvider};
     15 
     16    #[diplomat::opaque]
     17    /// An ICU4X ScriptWithExtensions map object, capable of holding a map of codepoints to scriptextensions values
     18    #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions, Struct)]
     19    pub struct ScriptWithExtensions(pub icu_properties::script::ScriptWithExtensions);
     20 
     21    #[diplomat::opaque]
     22    /// A slightly faster ScriptWithExtensions object
     23    #[diplomat::rust_link(icu::properties::script::ScriptWithExtensionsBorrowed, Struct)]
     24    pub struct ScriptWithExtensionsBorrowed<'a>(
     25        pub icu_properties::script::ScriptWithExtensionsBorrowed<'a>,
     26    );
     27    #[diplomat::opaque]
     28    /// An object that represents the Script_Extensions property for a single character
     29    #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet, Struct)]
     30    pub struct ScriptExtensionsSet<'a>(pub icu_properties::script::ScriptExtensionsSet<'a>);
     31 
     32    impl ScriptWithExtensions {
     33        /// Create a map for the `Script`/`Script_Extensions` properties, using compiled data.
     34        #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions::new, FnInStruct)]
     35        #[diplomat::rust_link(
     36            icu::properties::script::ScriptWithExtensionsBorrowed::new,
     37            FnInStruct,
     38            hidden
     39        )]
     40        #[diplomat::attr(auto, constructor)]
     41        #[cfg(feature = "compiled_data")]
     42        pub fn create() -> Box<ScriptWithExtensions> {
     43            Box::new(ScriptWithExtensions(
     44                icu_properties::script::ScriptWithExtensions::new().static_to_owned(),
     45            ))
     46        }
     47 
     48        /// Create a map for the `Script`/`Script_Extensions` properties, using compiled data.
     49        #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions::new, FnInStruct)]
     50        #[diplomat::rust_link(
     51            icu::properties::script::ScriptWithExtensionsBorrowed::new,
     52            FnInStruct,
     53            hidden
     54        )]
     55        #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")]
     56        #[cfg(feature = "buffer_provider")]
     57        pub fn create_with_provider(
     58            provider: &DataProvider,
     59        ) -> Result<Box<ScriptWithExtensions>, DataError> {
     60            Ok(Box::new(ScriptWithExtensions(
     61                icu_properties::script::ScriptWithExtensions::try_new_with_buffer_provider(
     62                    provider.get()?,
     63                )?,
     64            )))
     65        }
     66 
     67        /// Get the Script property value for a code point
     68        #[diplomat::rust_link(
     69            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val,
     70            FnInStruct
     71        )]
     72        #[diplomat::rust_link(
     73            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val32,
     74            FnInStruct,
     75            hidden
     76        )]
     77        pub fn get_script_val(&self, ch: DiplomatChar) -> u16 {
     78            self.0.as_borrowed().get_script_val32(ch).to_icu4c_value()
     79        }
     80 
     81        /// Check if the Script_Extensions property of the given code point covers the given script
     82        #[diplomat::rust_link(
     83            icu::properties::script::ScriptWithExtensionsBorrowed::has_script,
     84            FnInStruct
     85        )]
     86        #[diplomat::rust_link(
     87            icu::properties::script::ScriptWithExtensionsBorrowed::has_script32,
     88            FnInStruct,
     89            hidden
     90        )]
     91        pub fn has_script(&self, ch: DiplomatChar, script: u16) -> bool {
     92            self.0
     93                .as_borrowed()
     94                .has_script32(ch, icu_properties::props::Script::from_icu4c_value(script))
     95        }
     96 
     97        /// Borrow this object for a slightly faster variant with more operations
     98        #[diplomat::rust_link(
     99            icu::properties::script::ScriptWithExtensions::as_borrowed,
    100            FnInStruct
    101        )]
    102        #[diplomat::attr(auto, getter)]
    103        pub fn as_borrowed<'a>(&'a self) -> Box<ScriptWithExtensionsBorrowed<'a>> {
    104            Box::new(ScriptWithExtensionsBorrowed(self.0.as_borrowed()))
    105        }
    106 
    107        /// Get a list of ranges of code points that contain this script in their Script_Extensions values
    108        #[diplomat::rust_link(
    109            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_ranges,
    110            FnInStruct
    111        )]
    112        pub fn iter_ranges_for_script<'a>(
    113            &'a self,
    114            script: u16,
    115        ) -> Box<CodePointRangeIterator<'a>> {
    116            Box::new(CodePointRangeIterator(Box::new(
    117                self.0.as_borrowed().get_script_extensions_ranges(
    118                    icu_properties::props::Script::from_icu4c_value(script),
    119                ),
    120            )))
    121        }
    122    }
    123 
    124    impl<'a> ScriptWithExtensionsBorrowed<'a> {
    125        /// Get the Script property value for a code point
    126        #[diplomat::rust_link(
    127            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val,
    128            FnInStruct
    129        )]
    130        /// Get the Script property value for a code point
    131        #[diplomat::rust_link(
    132            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val32,
    133            FnInStruct,
    134            hidden
    135        )]
    136        pub fn get_script_val(&self, ch: DiplomatChar) -> u16 {
    137            self.0.get_script_val32(ch).to_icu4c_value()
    138        }
    139        /// Get the Script property value for a code point
    140        #[diplomat::rust_link(
    141            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_val,
    142            FnInStruct
    143        )]
    144        #[diplomat::rust_link(
    145            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_val32,
    146            FnInStruct,
    147            hidden
    148        )]
    149        pub fn get_script_extensions_val(&self, ch: DiplomatChar) -> Box<ScriptExtensionsSet<'a>> {
    150            Box::new(ScriptExtensionsSet(self.0.get_script_extensions_val32(ch)))
    151        }
    152        /// Check if the Script_Extensions property of the given code point covers the given script
    153        #[diplomat::rust_link(
    154            icu::properties::script::ScriptWithExtensionsBorrowed::has_script,
    155            FnInStruct
    156        )]
    157        #[diplomat::rust_link(
    158            icu::properties::script::ScriptWithExtensionsBorrowed::has_script32,
    159            FnInStruct,
    160            hidden
    161        )]
    162        pub fn has_script(&self, ch: DiplomatChar, script: u16) -> bool {
    163            self.0
    164                .has_script32(ch, icu_properties::props::Script::from_icu4c_value(script))
    165        }
    166 
    167        /// Build the CodePointSetData corresponding to a codepoints matching a particular script
    168        /// in their Script_Extensions
    169        #[diplomat::rust_link(
    170            icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_set,
    171            FnInStruct
    172        )]
    173        pub fn get_script_extensions_set(&self, script: u16) -> Box<CodePointSetData> {
    174            let list = self
    175                .0
    176                .get_script_extensions_set(icu_properties::props::Script::from_icu4c_value(script))
    177                .into_owned();
    178            let set = icu_properties::CodePointSetData::from_code_point_inversion_list(list);
    179            Box::new(CodePointSetData(set))
    180        }
    181    }
    182    impl<'a> ScriptExtensionsSet<'a> {
    183        /// Check if the Script_Extensions property of the given code point covers the given script
    184        #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::contains, FnInStruct)]
    185        pub fn contains(&self, script: u16) -> bool {
    186            self.0
    187                .contains(&icu_properties::props::Script::from_icu4c_value(script))
    188        }
    189 
    190        /// Get the number of scripts contained in here
    191        #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::iter, FnInStruct)]
    192        #[diplomat::attr(auto, getter)]
    193        pub fn count(&self) -> usize {
    194            self.0.array_len()
    195        }
    196 
    197        /// Get script at index
    198        #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::iter, FnInStruct)]
    199        pub fn script_at(&self, index: usize) -> Option<u16> {
    200            self.0.array_get(index).map(|x| x.to_icu4c_value())
    201        }
    202    }
    203 }