Skip to main content

DirectStaticSearch

Enum DirectStaticSearch 

Source
enum DirectStaticSearch {
    U16(Vec<u16>),
    U32(Vec<u32>),
}

Variants§

§

U16(Vec<u16>)

§

U32(Vec<u32>)

Implementations§

Source§

impl DirectStaticSearch

Source

fn build<K: SimdKey>(values: &[K], bits: u32) -> Self

Examples found in repository?
crates/competitive/src/data_structure/static_search.rs (line 890)
885    fn build(values: &[K], backend: SimdBackend, direct: bool) -> Self {
886        assert!(matches!(K::BITS, 8 | 16 | 32 | 64 | 128));
887        assert!(values.windows(2).all(|pair| pair[0] <= pair[1]));
888        let len = values.len();
889        let storage = match K::BITS {
890            8 => StaticSearchStorage::Direct(DirectStaticSearch::build(values, K::BITS)),
891            16 => {
892                if direct {
893                    StaticSearchStorage::Direct(DirectStaticSearch::build(values, K::BITS))
894                } else {
895                    StaticSearchStorage::U16(StaticSearchTree::build(
896                        values,
897                        u16::MAX,
898                        u16::MAX as u128,
899                        |value| value as u16,
900                        backend,
901                    ))
902                }
903            }
904            32 => StaticSearchStorage::U32(StaticSearchTree::build(
905                values,
906                u32::MAX,
907                u32::MAX as u128,
908                |value| value as u32,
909                backend,
910            )),
911            64 => StaticSearchStorage::U64(StaticSearchTree::build(
912                values,
913                u64::MAX,
914                u64::MAX as u128,
915                |value| value as u64,
916                backend,
917            )),
918            128 => StaticSearchStorage::U128(StaticSearchTree::build(
919                values,
920                u128::MAX,
921                u128::MAX,
922                |value| value,
923                backend,
924            )),
925            _ => unreachable!(),
926        };
927        Self {
928            storage,
929            len,
930            marker: PhantomData,
931        }
932    }
Source

fn lower_bound(&self, value: u128) -> usize

Examples found in repository?
crates/competitive/src/data_structure/static_search.rs (line 673)
671    fn lower_bound(&self, value: u128) -> usize {
672        match self {
673            Self::Direct(search) => search.lower_bound(value),
674            Self::U16(search) => search.lower_bound(
675                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
676            ),
677            Self::U32(search) => search.lower_bound(
678                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
679            ),
680            Self::U64(search) => search.lower_bound(
681                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
682            ),
683            Self::U128(search) => search.lower_bound(value),
684        }
685    }
686
687    #[inline(always)]
688    fn upper_bound(&self, value: u128) -> usize {
689        match self {
690            Self::Direct(search) => search.upper_bound(value),
691            Self::U16(search) => search.upper_bound(
692                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
693            ),
694            Self::U32(search) => search.upper_bound(
695                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
696            ),
697            Self::U64(search) => search.upper_bound(
698                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
699            ),
700            Self::U128(search) => search.upper_bound(value),
701        }
702    }
703
704    #[inline(always)]
705    fn contains(&self, value: u128) -> bool {
706        match self {
707            Self::Direct(search) => search.contains(value),
708            Self::U16(search) => search.contains(
709                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
710            ),
711            Self::U32(search) => search.contains(
712                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
713            ),
714            Self::U64(search) => search.contains(
715                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
716            ),
717            Self::U128(search) => search.contains(value),
718        }
719    }
720
721    fn lower_bound_batch<K: SimdKey>(&self, values: &[K], output: &mut [usize]) {
722        match self {
723            Self::Direct(search) => {
724                for (&value, position) in values.iter().zip(output) {
725                    *position = search.lower_bound(value.encode());
726                }
727            }
728            Self::U16(search) => search_batch(
729                values,
730                output,
731                |value| u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
732                |value| search.lower_bound(value),
733                |values| search.lower_bound_batch(values),
734            ),
735            Self::U32(search) => search_batch(
736                values,
737                output,
738                |value| u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
739                |value| search.lower_bound(value),
740                |values| search.lower_bound_batch(values),
741            ),
742            Self::U64(search) => search_batch(
743                values,
744                output,
745                |value| u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
746                |value| search.lower_bound(value),
747                |values| search.lower_bound_batch(values),
748            ),
749            Self::U128(search) => search_batch(
750                values,
751                output,
752                |value| value,
753                |value| search.lower_bound(value),
754                |values| search.lower_bound_batch(values),
755            ),
756        }
757    }
Source

fn upper_bound(&self, value: u128) -> usize

Examples found in repository?
crates/competitive/src/data_structure/static_search.rs (line 690)
688    fn upper_bound(&self, value: u128) -> usize {
689        match self {
690            Self::Direct(search) => search.upper_bound(value),
691            Self::U16(search) => search.upper_bound(
692                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
693            ),
694            Self::U32(search) => search.upper_bound(
695                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
696            ),
697            Self::U64(search) => search.upper_bound(
698                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
699            ),
700            Self::U128(search) => search.upper_bound(value),
701        }
702    }
703
704    #[inline(always)]
705    fn contains(&self, value: u128) -> bool {
706        match self {
707            Self::Direct(search) => search.contains(value),
708            Self::U16(search) => search.contains(
709                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
710            ),
711            Self::U32(search) => search.contains(
712                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
713            ),
714            Self::U64(search) => search.contains(
715                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
716            ),
717            Self::U128(search) => search.contains(value),
718        }
719    }
720
721    fn lower_bound_batch<K: SimdKey>(&self, values: &[K], output: &mut [usize]) {
722        match self {
723            Self::Direct(search) => {
724                for (&value, position) in values.iter().zip(output) {
725                    *position = search.lower_bound(value.encode());
726                }
727            }
728            Self::U16(search) => search_batch(
729                values,
730                output,
731                |value| u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
732                |value| search.lower_bound(value),
733                |values| search.lower_bound_batch(values),
734            ),
735            Self::U32(search) => search_batch(
736                values,
737                output,
738                |value| u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
739                |value| search.lower_bound(value),
740                |values| search.lower_bound_batch(values),
741            ),
742            Self::U64(search) => search_batch(
743                values,
744                output,
745                |value| u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
746                |value| search.lower_bound(value),
747                |values| search.lower_bound_batch(values),
748            ),
749            Self::U128(search) => search_batch(
750                values,
751                output,
752                |value| value,
753                |value| search.lower_bound(value),
754                |values| search.lower_bound_batch(values),
755            ),
756        }
757    }
758
759    fn upper_bound_batch<K: SimdKey>(&self, values: &[K], output: &mut [usize]) {
760        match self {
761            Self::Direct(search) => {
762                for (&value, position) in values.iter().zip(output) {
763                    *position = search.upper_bound(value.encode());
764                }
765            }
766            Self::U16(search) => search_batch(
767                values,
768                output,
769                |value| u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
770                |value| search.upper_bound(value),
771                |values| search.upper_bound_batch(values),
772            ),
773            Self::U32(search) => search_batch(
774                values,
775                output,
776                |value| u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
777                |value| search.upper_bound(value),
778                |values| search.upper_bound_batch(values),
779            ),
780            Self::U64(search) => search_batch(
781                values,
782                output,
783                |value| u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
784                |value| search.upper_bound(value),
785                |values| search.upper_bound_batch(values),
786            ),
787            Self::U128(search) => search_batch(
788                values,
789                output,
790                |value| value,
791                |value| search.upper_bound(value),
792                |values| search.upper_bound_batch(values),
793            ),
794        }
795    }
Source

fn contains(&self, value: u128) -> bool

Examples found in repository?
crates/competitive/src/data_structure/static_search.rs (line 707)
705    fn contains(&self, value: u128) -> bool {
706        match self {
707            Self::Direct(search) => search.contains(value),
708            Self::U16(search) => search.contains(
709                u16::try_from(value).expect("SimdKey::encode exceeds its declared width"),
710            ),
711            Self::U32(search) => search.contains(
712                u32::try_from(value).expect("SimdKey::encode exceeds its declared width"),
713            ),
714            Self::U64(search) => search.contains(
715                u64::try_from(value).expect("SimdKey::encode exceeds its declared width"),
716            ),
717            Self::U128(search) => search.contains(value),
718        }
719    }

Trait Implementations§

Source§

impl Clone for DirectStaticSearch

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DirectStaticSearch

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.