stackvec 0.2.1

A crate to use stack-allocated Vectors (performance and/or no-std)
pub trait Sealed {}

/// Trait to abstract over fixed-size (thus inline-able) [`array`]s.
///
/// Suprisingly, neither [rust's core](
/// https://doc.rust-lang.org/core) nor its [standard library](
/// https://doc.rust-lang.org/std) provide a unified abstraction over
/// fixed-size [`array`]s. Hence [this trait].
///
/// The trait is both `Sealed` and `unsafe`, to avoid it being implemented
/// on non-array elements, and to remind of the implicit assumptions about
/// the object's memory layout and interactions.
///
/// Sadly, this means that downstream crates cannot implement [this trait], not
/// even for an actual but very specific [`array`] that has not been already
/// given an implementation in this crate.
///
/// That's why, by [default](
/// https://doc.rust-lang.org/cargo/reference/manifest.html#rules),
/// the feature `a_thousand_array_impls` is enabled: it provides
/// implementations of [this trait] for **all arrays of
/// [`LEN`][`Array::LEN`] `<= 1000`**.
/// The reason for this is that
/// [`StackVec`]s conversions to/from [`array`]s (used by 
/// [`array.into_iter()`][`::stackvec::traits::ArrayIntoIter`]
/// and [`.try_collect()`][`::stackvec::traits::TryFromIterator`])
/// [involve / require a full `StackVec`][`::stackvec::traits::TryInto`], which
/// in turn requires very fine-grained control over the [`Array::LEN`] for the
/// operations to be efficient (avoid dealing with extra stuff / garbage).
///
/// However, all these `impl`s come at a very steep cost at compile time and
/// size, and may not be needed for those whishing to manipulate [`StackVec`]s
/// without converting to/from [`array`]s. In that case, the classic
/// exponentially-grown [`Array::LEN`]s for the backing [`StackVec::CAPACITY`]
/// should suffice:
///
/// - you may opt out of the `a_thousand_array_impls` [feature](
/// https://doc.rust-lang.org/cargo/reference/manifest.html#rules) replacing the
///   `stackvec = ...` line in the `Cargo.toml` file of your project by:
///   ```toml
///   stackvec = { version = ... , default-features = false }
///   ```
///
/// [`array`]: https://doc.rust-lang.org/std/primitive.array.html
/// [this trait]: `::stackvec::Array`
/// [`StackVec`]: `::stackvec::StackVec`
/// [`StackVec::CAPACITY`]: `::stackvec::StackVec::CAPACITY`
pub unsafe trait Array: Sealed + Sized {
    /// `[Item; LEN]`
    type Item: Sized;

    /// `[Item; LEN]`
    const LEN: usize;

    /// Read-only pointer to the first (`0`-th) element of the array.
    ///
    /// Used to get a pointer to the `n`-th element using [`.offset(n)`].
    ///
    /// [`.offset(n)`]:
    /// https://doc.rust-lang.org/std/primitive.pointer.html#method.offset
    fn as_ptr (
        self: &Self,
    ) -> *const Self::Item;

    /// Read-write pointer to the first (`0`-th) element of the array.
    ///
    /// Used to get a pointer to the `n`-th element using [`.offset(n)`].
    ///
    /// [`.offset(n)`]:
    /// https://doc.rust-lang.org/std/primitive.pointer.html#method.offset-1
    fn as_mut_ptr (
        self: &mut Self,
    ) -> *mut Self::Item;
}

macro_rules! impl_array {
    ($N:expr) => (
        impl<T: Sized> Sealed for [T; $N] {}
        unsafe impl<T: Sized> Array for [T; $N] {
            type Item = T;

            const LEN: usize = $N;

            #[inline(always)]
            fn as_ptr (
                self: &Self,
            ) -> *const Self::Item
            {
                <[Self::Item]>::as_ptr(self)
            }

            #[inline(always)]
            fn as_mut_ptr (
                self: &mut Self,
            ) -> *mut Self::Item
            {
                <[Self::Item]>::as_mut_ptr(self)
            }
        }
    )
}

macro_rules! impl_arrays {
    (
        $($N:expr,)*
    ) => (
        $( impl_array!($N); )*
    )
}

// Top 100
impl_arrays! {
    0,    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,   66,   67,   68,   69,   70,   71,  
    72,   73,   74,   75,   76,   77,   78,   79,   80,   81,   82,   83,  
    84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,  
    96,   97,   98,   99,   100,
}

// 100 < ... <= 1000 (sparse)
#[cfg(not(feature = "a_thousand_array_impls"))]
impl_arrays! {
    200,  256,  300,  400,  500,  512,  600,  700,  800,  900,  1000,
}

// 1024 and onwards
impl_arrays! {
    0x400, 0x800, 0x1000, 0x2000, 0x4000,
        0x600, 0xc00, 0x1800, 0x3000,
}

// 100 < ... <= 1000 (full)
#[cfg(feature = "a_thousand_array_impls")]
impl_arrays! {
    101,  102,  103,  104,  105,  106,  107,  108,  109,  110,  111,  112, 
    113,  114,  115,  116,  117,  118,  119,  120,  121,  122,  123,  124, 
    125,  126,  127,  128,  129,  130,  131,  132,  133,  134,  135,  136, 
    137,  138,  139,  140,  141,  142,  143,  144,  145,  146,  147,  148, 
    149,  150,  151,  152,  153,  154,  155,  156,  157,  158,  159,  160, 
    161,  162,  163,  164,  165,  166,  167,  168,  169,  170,  171,  172, 
    173,  174,  175,  176,  177,  178,  179,  180,  181,  182,  183,  184, 
    185,  186,  187,  188,  189,  190,  191,  192,  193,  194,  195,  196, 
    197,  198,  199,  200,  201,  202,  203,  204,  205,  206,  207,  208, 
    209,  210,  211,  212,  213,  214,  215,  216,  217,  218,  219,  220, 
    221,  222,  223,  224,  225,  226,  227,  228,  229,  230,  231,  232, 
    233,  234,  235,  236,  237,  238,  239,  240,  241,  242,  243,  244, 
    245,  246,  247,  248,  249,  250,  251,  252,  253,  254,  255,  256, 
    257,  258,  259,  260,  261,  262,  263,  264,  265,  266,  267,  268, 
    269,  270,  271,  272,  273,  274,  275,  276,  277,  278,  279,  280, 
    281,  282,  283,  284,  285,  286,  287,  288,  289,  290,  291,  292, 
    293,  294,  295,  296,  297,  298,  299,  300,  301,  302,  303,  304, 
    305,  306,  307,  308,  309,  310,  311,  312,  313,  314,  315,  316, 
    317,  318,  319,  320,  321,  322,  323,  324,  325,  326,  327,  328, 
    329,  330,  331,  332,  333,  334,  335,  336,  337,  338,  339,  340, 
    341,  342,  343,  344,  345,  346,  347,  348,  349,  350,  351,  352, 
    353,  354,  355,  356,  357,  358,  359,  360,  361,  362,  363,  364, 
    365,  366,  367,  368,  369,  370,  371,  372,  373,  374,  375,  376, 
    377,  378,  379,  380,  381,  382,  383,  384,  385,  386,  387,  388, 
    389,  390,  391,  392,  393,  394,  395,  396,  397,  398,  399,  400, 
    401,  402,  403,  404,  405,  406,  407,  408,  409,  410,  411,  412, 
    413,  414,  415,  416,  417,  418,  419,  420,  421,  422,  423,  424, 
    425,  426,  427,  428,  429,  430,  431,  432,  433,  434,  435,  436, 
    437,  438,  439,  440,  441,  442,  443,  444,  445,  446,  447,  448, 
    449,  450,  451,  452,  453,  454,  455,  456,  457,  458,  459,  460, 
    461,  462,  463,  464,  465,  466,  467,  468,  469,  470,  471,  472, 
    473,  474,  475,  476,  477,  478,  479,  480,  481,  482,  483,  484, 
    485,  486,  487,  488,  489,  490,  491,  492,  493,  494,  495,  496, 
    497,  498,  499,  500,  501,  502,  503,  504,  505,  506,  507,  508, 
    509,  510,  511,  512,  513,  514,  515,  516,  517,  518,  519,  520, 
    521,  522,  523,  524,  525,  526,  527,  528,  529,  530,  531,  532, 
    533,  534,  535,  536,  537,  538,  539,  540,  541,  542,  543,  544, 
    545,  546,  547,  548,  549,  550,  551,  552,  553,  554,  555,  556, 
    557,  558,  559,  560,  561,  562,  563,  564,  565,  566,  567,  568, 
    569,  570,  571,  572,  573,  574,  575,  576,  577,  578,  579,  580, 
    581,  582,  583,  584,  585,  586,  587,  588,  589,  590,  591,  592, 
    593,  594,  595,  596,  597,  598,  599,  600,  601,  602,  603,  604, 
    605,  606,  607,  608,  609,  610,  611,  612,  613,  614,  615,  616, 
    617,  618,  619,  620,  621,  622,  623,  624,  625,  626,  627,  628, 
    629,  630,  631,  632,  633,  634,  635,  636,  637,  638,  639,  640, 
    641,  642,  643,  644,  645,  646,  647,  648,  649,  650,  651,  652, 
    653,  654,  655,  656,  657,  658,  659,  660,  661,  662,  663,  664, 
    665,  666,  667,  668,  669,  670,  671,  672,  673,  674,  675,  676, 
    677,  678,  679,  680,  681,  682,  683,  684,  685,  686,  687,  688, 
    689,  690,  691,  692,  693,  694,  695,  696,  697,  698,  699,  700, 
    701,  702,  703,  704,  705,  706,  707,  708,  709,  710,  711,  712, 
    713,  714,  715,  716,  717,  718,  719,  720,  721,  722,  723,  724, 
    725,  726,  727,  728,  729,  730,  731,  732,  733,  734,  735,  736, 
    737,  738,  739,  740,  741,  742,  743,  744,  745,  746,  747,  748, 
    749,  750,  751,  752,  753,  754,  755,  756,  757,  758,  759,  760, 
    761,  762,  763,  764,  765,  766,  767,  768,  769,  770,  771,  772, 
    773,  774,  775,  776,  777,  778,  779,  780,  781,  782,  783,  784, 
    785,  786,  787,  788,  789,  790,  791,  792,  793,  794,  795,  796, 
    797,  798,  799,  800,  801,  802,  803,  804,  805,  806,  807,  808, 
    809,  810,  811,  812,  813,  814,  815,  816,  817,  818,  819,  820, 
    821,  822,  823,  824,  825,  826,  827,  828,  829,  830,  831,  832, 
    833,  834,  835,  836,  837,  838,  839,  840,  841,  842,  843,  844, 
    845,  846,  847,  848,  849,  850,  851,  852,  853,  854,  855,  856, 
    857,  858,  859,  860,  861,  862,  863,  864,  865,  866,  867,  868, 
    869,  870,  871,  872,  873,  874,  875,  876,  877,  878,  879,  880, 
    881,  882,  883,  884,  885,  886,  887,  888,  889,  890,  891,  892, 
    893,  894,  895,  896,  897,  898,  899,  900,  901,  902,  903,  904, 
    905,  906,  907,  908,  909,  910,  911,  912,  913,  914,  915,  916, 
    917,  918,  919,  920,  921,  922,  923,  924,  925,  926,  927,  928, 
    929,  930,  931,  932,  933,  934,  935,  936,  937,  938,  939,  940, 
    941,  942,  943,  944,  945,  946,  947,  948,  949,  950,  951,  952, 
    953,  954,  955,  956,  957,  958,  959,  960,  961,  962,  963,  964, 
    965,  966,  967,  968,  969,  970,  971,  972,  973,  974,  975,  976, 
    977,  978,  979,  980,  981,  982,  983,  984,  985,  986,  987,  988, 
    989,  990,  991,  992,  993,  994,  995,  996,  997,  998,  999,  1000,
}