     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65

    use crate::base::allocator::Allocator;
    use crate::base::{DefaultAllocator, DimName, Scalar};
    use crate::geometry::{Point, Point2, Point3};
    use typenum::{self, Cmp, Greater};

    macro_rules! impl_swizzle {
        ($( where $BaseDim: ident: $( $name: ident() -> $Result: ident[$($i: expr),+] ),+ ;)* ) => {
            $(
                impl<N: Scalar, D: DimName> Point<N, D>
                where
                    DefaultAllocator: Allocator<N, D>,
                    D::Value: Cmp<typenum::$BaseDim, Output=Greater>
                {
                    $(
                        /// Builds a new point from components of `self`.
                        #[inline]
                        pub fn $name(&self) -> $Result<N> {
                            $Result::new($(self[$i]),*)
                        }
                    )*
                }
            )*
        }
    }

    impl_swizzle!(
        where U0: xx()  -> Point2[0, 0],
                  xxx() -> Point3[0, 0, 0];

        where U1: xy()  -> Point2[0, 1],
                  yx()  -> Point2[1, 0],
                  yy()  -> Point2[1, 1],
                  xxy() -> Point3[0, 0, 1],
                  xyx() -> Point3[0, 1, 0],
                  xyy() -> Point3[0, 1, 1],
                  yxx() -> Point3[1, 0, 0],
                  yxy() -> Point3[1, 0, 1],
                  yyx() -> Point3[1, 1, 0],
                  yyy() -> Point3[1, 1, 1];

        where U2: xz()  -> Point2[0, 2],
                  yz()  -> Point2[1, 2],
                  zx()  -> Point2[2, 0],
                  zy()  -> Point2[2, 1],
                  zz()  -> Point2[2, 2],
                  xxz() -> Point3[0, 0, 2],
                  xyz() -> Point3[0, 1, 2],
                  xzx() -> Point3[0, 2, 0],
                  xzy() -> Point3[0, 2, 1],
                  xzz() -> Point3[0, 2, 2],
                  yxz() -> Point3[1, 0, 2],
                  yyz() -> Point3[1, 1, 2],
                  yzx() -> Point3[1, 2, 0],
                  yzy() -> Point3[1, 2, 1],
                  yzz() -> Point3[1, 2, 2],
                  zxx() -> Point3[2, 0, 0],
                  zxy() -> Point3[2, 0, 1],
                  zxz() -> Point3[2, 0, 2],
                  zyx() -> Point3[2, 1, 0],
                  zyy() -> Point3[2, 1, 1],
                  zyz() -> Point3[2, 1, 2],
                  zzx() -> Point3[2, 2, 0],
                  zzy() -> Point3[2, 2, 1],
                  zzz() -> Point3[2, 2, 2];
    );

# Help

## Keyboard Shortcuts

`?`
  Show this help dialog
`S`
  Focus the search field
`↑`
  Move up in search results
`↓`
  Move down in search results
`↹`
  Switch tab
`⏎`
  Go to active search result
`+`
  Expand all sections
`-`
  Collapse all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g., `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g., `vec -> usize` or `* -> vec`)

Search multiple things at once by splitting your query with comma (e.g., `str,u8` or `String,struct:Vec,test`)