enum DirectStaticSearch {
U16(Vec<u16>),
U32(Vec<u32>),
}Variants§
Implementations§
Source§impl DirectStaticSearch
impl DirectStaticSearch
Sourcefn build<K: SimdKey>(values: &[K], bits: u32) -> Self
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 }Sourcefn lower_bound(&self, value: u128) -> usize
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 }Sourcefn upper_bound(&self, value: u128) -> usize
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 }Sourcefn contains(&self, value: u128) -> bool
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
impl Clone for DirectStaticSearch
Auto Trait Implementations§
impl Freeze for DirectStaticSearch
impl RefUnwindSafe for DirectStaticSearch
impl Send for DirectStaticSearch
impl Sync for DirectStaticSearch
impl Unpin for DirectStaticSearch
impl UnsafeUnpin for DirectStaticSearch
impl UnwindSafe for DirectStaticSearch
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more