diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f3142fb..ffc688b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,7 +11,7 @@ jobs: strategy: matrix: - toolchain: ['1.60', stable, beta, nightly] + toolchain: ['1.66', stable, beta, nightly] steps: - uses: actions/checkout@v3 diff --git a/Cargo.toml b/Cargo.toml index 9951535..5dc462b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,16 @@ repository = "https://github.com/rossmacarthur/constcat" license = "MIT OR Apache-2.0" keywords = ["concat", "const"] categories = ["no-std", "rust-patterns"] +include = ["src/lib.rs", "LICENSE-*", "README.md"] [features] # Private API: compiles the tests for the concat_bytes! macro _bytes = [] + +[[bench]] +name = "large" +harness = false + +[[bench]] +name = "many" +harness = false diff --git a/README.md b/README.md index f70c558..9daec9f 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ const COLORS: &[(u8, u8, u8)] = concat_slices!([(u8, u8, u8)]: PRIMARIES, SECOND ### MSRV -This crate supports Rust 1.60 and above. +This crate supports Rust 1.66 and above. [`std::concat!`]: core::concat diff --git a/benches/large.rs b/benches/large.rs new file mode 100644 index 0000000..c68a4db --- /dev/null +++ b/benches/large.rs @@ -0,0 +1,14 @@ +// hyperfine "cargo clean && cargo bench --bench large --no-run" + +const LARGE: &str = include_str!("large.txt"); +const LARGES: &str = constcat::concat!(LARGE, LARGE); + +fn main() { + let expected = { + let mut s = String::new(); + s.push_str(LARGE); + s.push_str(LARGE); + s + }; + assert_eq!(LARGES, expected); +} diff --git a/benches/large.txt b/benches/large.txt new file mode 100644 index 0000000..50c6bfd --- /dev/null +++ b/benches/large.txt @@ -0,0 +1,191 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum non sodales purus. Nullam magna massa, porttitor in nisl a, ultrices varius nunc. Nunc convallis dui et justo sollicitudin aliquet. Cras placerat congue orci ut gravida. Sed et neque ut augue lobortis pellentesque. Integer feugiat tincidunt risus, ac porttitor eros pretium at. Vivamus vitae dictum est, ut fringilla odio. Maecenas hendrerit, est eget malesuada rhoncus, quam mauris ullamcorper mi, id fermentum nibh risus a ex. Integer et gravida orci. + +Quisque molestie quis augue sed posuere. Vestibulum non dolor eros. Curabitur porttitor est at volutpat iaculis. Mauris in fermentum diam, a maximus velit. Maecenas pharetra bibendum libero et aliquam. Praesent eu scelerisque urna, nec bibendum risus. Quisque et eros id quam accumsan aliquet id non libero. Fusce ac molestie enim. Nam vitae efficitur nisi, ac placerat lacus. Morbi mollis bibendum efficitur. Fusce quis efficitur nunc. Morbi a euismod dolor, ut ultrices urna. Mauris suscipit congue enim non bibendum. Cras eget tincidunt ante. Quisque non augue fringilla, hendrerit velit ut, vehicula velit. Cras sollicitudin, sem non lacinia placerat, massa felis porttitor tortor, in luctus arcu mauris id leo. + +Suspendisse aliquet eu est quis blandit. Quisque sit amet ligula nec leo dapibus consectetur at id elit. Ut quis ligula vulputate, euismod sapien eget, luctus orci. Duis porttitor tellus urna, id pretium lectus tempus non. Pellentesque sit amet tellus sapien. In consequat vitae nisl sed feugiat. Phasellus diam lectus, commodo et lacinia ut, vestibulum non erat. In eget lobortis lorem. Aenean interdum nibh eget nibh luctus mollis. Integer ac nisl at augue placerat mattis a at libero. Vivamus varius, tellus non dapibus lacinia, velit justo auctor justo, in blandit odio velit tristique est. Morbi iaculis mauris et tempus vehicula. Pellentesque ultricies placerat dapibus. + +Nullam pellentesque euismod malesuada. Aliquam erat volutpat. Cras commodo nisl eget molestie interdum. Mauris enim lorem, pharetra non mollis quis, feugiat vitae mi. Maecenas ante ante, aliquam ac quam sit amet, vestibulum rutrum nunc. Sed eget purus et lorem luctus maximus. Vivamus lobortis sapien vitae lacinia consequat. Nunc sed nisi justo. Sed eu purus tempor ipsum sagittis iaculis. Nam ultricies lorem sit amet mi lobortis, id condimentum turpis aliquet. Etiam ullamcorper ultrices volutpat. Vestibulum id ullamcorper leo. + +Curabitur nec nibh ac velit auctor laoreet. Aliquam erat volutpat. Sed vel volutpat sem, at finibus elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas feugiat ornare lacus pretium ultricies. Vestibulum tincidunt quam non diam efficitur eleifend. Donec eleifend nunc dui, et feugiat elit tempor a. Mauris erat libero, accumsan at elit at, scelerisque convallis ligula. Cras ullamcorper eros lorem, vitae cursus augue tristique eu. + +Sed sed consectetur nibh. Morbi accumsan luctus gravida. Etiam eget mi rutrum, sagittis felis rutrum, viverra sem. Nam consectetur quam sem, elementum dapibus nulla efficitur sit amet. Donec quis tristique metus. Vestibulum lacinia augue vel justo efficitur, at imperdiet augue commodo. Curabitur vulputate laoreet rutrum. Nam lobortis, est sit amet vulputate suscipit, velit dui tincidunt lorem, vel feugiat quam arcu non tellus. Maecenas ullamcorper ex ac dui volutpat, a mattis magna bibendum. Fusce id viverra elit, eu egestas turpis. Vestibulum varius faucibus arcu a eleifend. Vivamus ut urna eget massa auctor auctor ultrices at libero. Vestibulum ut efficitur mi. Ut molestie malesuada quam, ac aliquam ex congue a. + +Morbi nec condimentum dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque non dui quis nibh feugiat viverra vitae ac nunc. Nulla ullamcorper tempus nibh non vulputate. Quisque non mi non urna venenatis sollicitudin a eget ipsum. Quisque varius, nisi a lobortis eleifend, lorem diam finibus nisl, ac facilisis tortor metus non mi. Curabitur auctor condimentum orci, et tempus nunc suscipit et. Quisque sed ligula sollicitudin, ornare sapien quis, hendrerit enim. Aliquam erat volutpat. In eleifend nunc lorem, finibus vestibulum risus tempor sit amet. Fusce eget convallis tellus. Vestibulum eget arcu ac odio faucibus suscipit id bibendum ipsum. Praesent id urna nec ligula molestie molestie. + +Duis id massa ut est congue euismod vitae a est. Morbi faucibus neque nisi, ac efficitur ante vestibulum id. Mauris aliquam in felis at malesuada. Aliquam in elementum ex. Aliquam vestibulum placerat libero dapibus convallis. Nunc maximus mauris quis sem consectetur, a iaculis metus ultricies. Nam nec porta quam. Curabitur at porttitor turpis. Curabitur efficitur facilisis mauris vitae fringilla. Mauris ut libero fringilla, auctor eros vel, sagittis orci. In viverra dolor congue, iaculis massa at, gravida sem. Morbi sagittis, enim at blandit rhoncus, ligula enim laoreet dolor, nec interdum elit lacus eu sem. Duis non sollicitudin risus. Proin eget dolor faucibus, dictum sapien eget, fermentum eros. Donec eget maximus arcu. + +Sed eleifend volutpat leo, sit amet iaculis orci mollis sed. Vestibulum imperdiet dui bibendum, elementum nisl nec, tempus nulla. Donec et vulputate tortor. Nunc a nulla lacinia, pellentesque eros id, venenatis nisl. Donec pulvinar, metus id vestibulum vestibulum, sem libero venenatis odio, sed fringilla augue nunc a erat. Donec sodales, leo sit amet tempus auctor, purus sem volutpat diam, eget laoreet leo sapien at lectus. Sed consectetur ante at mauris feugiat tempus. Quisque bibendum sit amet mauris at tristique. Duis sed elit eleifend, tincidunt neque id, interdum dolor. Sed orci magna, faucibus quis purus in, egestas ultrices ipsum. Nulla efficitur lacus in tellus tincidunt, sit amet bibendum tortor luctus. Ut gravida aliquet pretium. + +Nam aliquam sapien lectus, eu feugiat lacus ullamcorper vitae. Phasellus egestas elementum odio quis blandit. Nunc efficitur est ac accumsan volutpat. Aenean convallis dui sed massa tincidunt, et viverra enim volutpat. Aliquam a libero nec nulla lacinia bibendum. Etiam a tellus eget neque suscipit luctus a lacinia nunc. Sed euismod laoreet imperdiet. Vivamus in elit bibendum mauris eleifend suscipit. Morbi finibus, nibh eu condimentum suscipit, eros arcu tincidunt odio, vitae efficitur dui lorem quis orci. Phasellus eleifend, lorem in aliquam suscipit, metus felis cursus purus, sit amet venenatis ligula sapien nec elit. Nam accumsan tincidunt magna vitae viverra. Nullam congue dolor ac tortor pretium congue. Morbi consequat erat odio, sed sollicitudin leo lacinia efficitur. + +Donec quis ornare justo. Donec vehicula fringilla pharetra. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed massa lectus, tristique accumsan consectetur ac, sodales sed lacus. Vestibulum eleifend nunc sit amet sollicitudin rhoncus. Donec id turpis id est aliquet viverra. Suspendisse et ipsum augue. In hac habitasse platea dictumst. Mauris vel tortor ligula. Duis dui risus, pharetra non nulla at, tristique pellentesque lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis tortor non dapibus pharetra. Aenean sit amet enim nec velit euismod venenatis. Donec congue efficitur mi non ultrices. Praesent in lacinia urna, nec vulputate mi. + +Proin ac sem in leo tincidunt pellentesque id ac magna. Donec finibus fermentum semper. In hac habitasse platea dictumst. Morbi varius enim molestie nulla ornare, at varius tellus varius. Cras euismod rhoncus massa sollicitudin vestibulum. Vivamus rhoncus, lectus non viverra dignissim, sem dolor molestie dui, vitae pulvinar orci leo sed nulla. Sed et ipsum nec nibh dictum mattis non eu nulla. Suspendisse interdum eu magna fermentum interdum. Etiam eu fringilla sem. Nulla hendrerit volutpat nunc a convallis. In quis condimentum lorem. Ut convallis orci non dolor posuere dignissim. Aenean a mi nisl. Maecenas dignissim scelerisque metus, sit amet viverra metus pellentesque at. Suspendisse volutpat elit id pellentesque vulputate. Proin non tempor mi. + +Duis porta enim id ipsum eleifend pharetra eu sit amet turpis. Nulla facilisi. Aliquam erat volutpat. Aenean semper blandit lacus eu venenatis. Sed imperdiet eu purus eget tristique. Phasellus sollicitudin scelerisque ipsum quis auctor. Duis ultricies quam vitae dignissim sodales. Aliquam ex lacus, iaculis vel scelerisque ac, facilisis id magna. Sed ullamcorper ante at tempus ullamcorper. + +Vivamus feugiat pulvinar elit quis blandit. Pellentesque auctor varius purus ut varius. Etiam sed massa posuere turpis consequat lobortis eget ut lacus. Etiam id arcu cursus, finibus metus a, egestas ante. Nam mattis mauris ut arcu faucibus, dapibus semper augue auctor. Nulla facilisi. Suspendisse suscipit ultricies metus, sed faucibus sapien elementum at. Phasellus vel metus vehicula, condimentum ipsum quis, convallis arcu. + +Morbi tortor magna, fringilla accumsan velit sed, gravida ultrices felis. Morbi accumsan leo molestie consectetur iaculis. Nulla neque sapien, laoreet vitae urna a, luctus sodales lacus. Sed ut odio pellentesque, dictum libero non, aliquam velit. Curabitur vel metus vulputate, pretium odio nec, suscipit massa. Suspendisse elementum est quis metus maximus ullamcorper. Vestibulum laoreet, nunc ut consequat dignissim, risus enim feugiat eros, ac bibendum libero lacus vel risus. Morbi nisi purus, accumsan quis augue a, ornare varius nisl. Nulla facilisi. Fusce porta quam et varius egestas. Integer posuere ac neque id tristique. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec molestie enim ut pretium congue. + +Vestibulum at molestie tellus. Nulla facilisi. Praesent sem odio, fringilla nec dignissim vel, commodo nec nisi. Ut quis odio diam. Praesent a turpis a magna vestibulum porttitor. Morbi vitae odio nulla. Vivamus faucibus congue accumsan. + +Proin elementum est enim, in fermentum justo malesuada vel. Curabitur non nisi ut massa tristique dictum. Duis mollis at magna eget elementum. Vivamus quis tempor mauris. Cras pulvinar, sapien a euismod vestibulum, mi metus posuere velit, at malesuada sem ipsum nec quam. Praesent sit amet euismod tortor, id sollicitudin nibh. Quisque auctor convallis tellus vitae hendrerit. Sed et odio tortor. Vivamus egestas enim non rhoncus scelerisque. + +Aenean condimentum efficitur tellus vitae dapibus. Praesent id blandit lectus, a efficitur mauris. Sed sagittis arcu a urna mattis vehicula. Aliquam volutpat nulla fermentum tortor tincidunt venenatis. Nunc pulvinar ante eget felis luctus, venenatis laoreet dolor volutpat. Aliquam augue dui, convallis ac justo id, volutpat vulputate nisl. Duis vitae leo mattis, tristique metus eu, luctus ex. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce non ante rutrum, aliquet libero et, pulvinar neque. + +Nam vehicula fringilla aliquet. Donec tincidunt egestas metus, id eleifend turpis facilisis sed. Sed mollis volutpat est ut mattis. Curabitur efficitur lorem eu ipsum aliquam ullamcorper. Donec vitae risus semper libero luctus porttitor non a neque. Aliquam sed facilisis lectus, placerat faucibus libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sed dictum est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque hendrerit ligula turpis, quis sagittis nunc ultricies eget. Nam vel metus volutpat, consequat velit et, posuere purus. Mauris sed ligula at nisi eleifend iaculis quis a urna. Duis tempus, lectus aliquam pharetra rhoncus, metus libero laoreet tortor, sed ultrices eros elit vitae libero. Aenean sit amet dignissim felis. In vel sapien ac massa pellentesque egestas. + +Proin sed tortor volutpat, lobortis quam sit amet, molestie dui. Suspendisse nec eros at nulla ultricies congue. Sed sit amet urna sed justo fermentum consequat vitae sed leo. Nunc maximus, felis non pulvinar hendrerit, leo orci imperdiet nisl, vitae mattis turpis leo ac justo. Nam quis nisl ut sem rhoncus iaculis ut eget erat. Phasellus imperdiet vitae tortor ac auctor. Fusce luctus nibh sit amet dolor pellentesque porttitor. Curabitur vitae gravida ex, in vulputate justo. Duis eu suscipit nibh. Donec aliquam dui gravida accumsan porta. Duis eu sapien elit. Aliquam tellus massa, tempor eget dui nec, pellentesque rutrum erat. Pellentesque eget orci id dui luctus auctor. + +Aenean vehicula vel justo nec lacinia. Donec sodales pretium leo eu viverra. Aenean eu mi dolor. Fusce venenatis finibus felis elementum malesuada. Nullam sit amet tristique ex, non sollicitudin dui. Nulla lacinia dolor sit amet ante commodo, nec suscipit dolor ultricies. Donec at nibh nec enim tincidunt molestie. + +Sed finibus vehicula sagittis. Sed sodales convallis posuere. Proin porta mi vel bibendum fringilla. Nullam suscipit nisl ut orci tincidunt, sed semper purus vestibulum. Maecenas blandit ullamcorper porttitor. Duis quis euismod mi. Proin eget volutpat metus, ut viverra quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse augue libero, fermentum tempus mi id, rhoncus pharetra ipsum. Morbi consequat ultrices lacus, vel pharetra eros tempor a. Nulla in hendrerit lacus. Nam purus odio, feugiat quis ullamcorper at, vehicula sit amet erat. Ut orci diam, porttitor in odio nec, sagittis commodo elit. Aenean ipsum magna, finibus at blandit vitae, posuere id eros. Curabitur neque enim, tristique a urna eu, fermentum varius felis. Nulla facilisi. + +Curabitur placerat et nibh a pulvinar. Donec placerat metus leo, sit amet consequat sem consequat vitae. Morbi in lacus id dolor fringilla luctus sit amet a metus. Nullam nec odio non lectus facilisis feugiat. Quisque et faucibus nulla. Cras quis est id erat rutrum commodo. Maecenas porta odio et mi viverra commodo. Nulla placerat nec arcu vel pellentesque. Donec dignissim consectetur quam interdum porttitor. Quisque sit amet rhoncus nibh, ac imperdiet ante. Suspendisse sapien ante, tincidunt et nulla dictum, vehicula ullamcorper quam. Morbi commodo condimentum egestas. Quisque velit tellus, suscipit vel mi at, ullamcorper venenatis ligula. Pellentesque malesuada auctor blandit. Proin faucibus finibus euismod. Ut in erat at neque porttitor sagittis vehicula a enim. + +Phasellus sit amet gravida ligula. Aenean aliquet, nibh imperdiet dictum elementum, massa dolor ultricies nibh, ut sodales dolor justo eu mi. Vestibulum commodo tellus ac sem aliquet, et sagittis neque tristique. Sed molestie nisl justo, nec laoreet augue facilisis in. Maecenas vel malesuada arcu, a maximus arcu. Sed porttitor orci ac nisi efficitur laoreet. Proin ut aliquet arcu. Curabitur in porta nunc. Curabitur eleifend molestie porttitor. Duis ut mollis ante, non congue massa. In ante mi, condimentum a tortor ut, cursus tincidunt erat. Maecenas rutrum fringilla sagittis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse augue erat, gravida ac fermentum nec, malesuada at diam. Cras eget aliquet nulla, id pulvinar sapien. Aliquam malesuada sem eget nibh eleifend tincidunt. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum non sodales purus. Nullam magna massa, porttitor in nisl a, ultrices varius nunc. Nunc convallis dui et justo sollicitudin aliquet. Cras placerat congue orci ut gravida. Sed et neque ut augue lobortis pellentesque. Integer feugiat tincidunt risus, ac porttitor eros pretium at. Vivamus vitae dictum est, ut fringilla odio. Maecenas hendrerit, est eget malesuada rhoncus, quam mauris ullamcorper mi, id fermentum nibh risus a ex. Integer et gravida orci. + +Quisque molestie quis augue sed posuere. Vestibulum non dolor eros. Curabitur porttitor est at volutpat iaculis. Mauris in fermentum diam, a maximus velit. Maecenas pharetra bibendum libero et aliquam. Praesent eu scelerisque urna, nec bibendum risus. Quisque et eros id quam accumsan aliquet id non libero. Fusce ac molestie enim. Nam vitae efficitur nisi, ac placerat lacus. Morbi mollis bibendum efficitur. Fusce quis efficitur nunc. Morbi a euismod dolor, ut ultrices urna. Mauris suscipit congue enim non bibendum. Cras eget tincidunt ante. Quisque non augue fringilla, hendrerit velit ut, vehicula velit. Cras sollicitudin, sem non lacinia placerat, massa felis porttitor tortor, in luctus arcu mauris id leo. + +Suspendisse aliquet eu est quis blandit. Quisque sit amet ligula nec leo dapibus consectetur at id elit. Ut quis ligula vulputate, euismod sapien eget, luctus orci. Duis porttitor tellus urna, id pretium lectus tempus non. Pellentesque sit amet tellus sapien. In consequat vitae nisl sed feugiat. Phasellus diam lectus, commodo et lacinia ut, vestibulum non erat. In eget lobortis lorem. Aenean interdum nibh eget nibh luctus mollis. Integer ac nisl at augue placerat mattis a at libero. Vivamus varius, tellus non dapibus lacinia, velit justo auctor justo, in blandit odio velit tristique est. Morbi iaculis mauris et tempus vehicula. Pellentesque ultricies placerat dapibus. + +Nullam pellentesque euismod malesuada. Aliquam erat volutpat. Cras commodo nisl eget molestie interdum. Mauris enim lorem, pharetra non mollis quis, feugiat vitae mi. Maecenas ante ante, aliquam ac quam sit amet, vestibulum rutrum nunc. Sed eget purus et lorem luctus maximus. Vivamus lobortis sapien vitae lacinia consequat. Nunc sed nisi justo. Sed eu purus tempor ipsum sagittis iaculis. Nam ultricies lorem sit amet mi lobortis, id condimentum turpis aliquet. Etiam ullamcorper ultrices volutpat. Vestibulum id ullamcorper leo. + +Curabitur nec nibh ac velit auctor laoreet. Aliquam erat volutpat. Sed vel volutpat sem, at finibus elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas feugiat ornare lacus pretium ultricies. Vestibulum tincidunt quam non diam efficitur eleifend. Donec eleifend nunc dui, et feugiat elit tempor a. Mauris erat libero, accumsan at elit at, scelerisque convallis ligula. Cras ullamcorper eros lorem, vitae cursus augue tristique eu. + +Sed sed consectetur nibh. Morbi accumsan luctus gravida. Etiam eget mi rutrum, sagittis felis rutrum, viverra sem. Nam consectetur quam sem, elementum dapibus nulla efficitur sit amet. Donec quis tristique metus. Vestibulum lacinia augue vel justo efficitur, at imperdiet augue commodo. Curabitur vulputate laoreet rutrum. Nam lobortis, est sit amet vulputate suscipit, velit dui tincidunt lorem, vel feugiat quam arcu non tellus. Maecenas ullamcorper ex ac dui volutpat, a mattis magna bibendum. Fusce id viverra elit, eu egestas turpis. Vestibulum varius faucibus arcu a eleifend. Vivamus ut urna eget massa auctor auctor ultrices at libero. Vestibulum ut efficitur mi. Ut molestie malesuada quam, ac aliquam ex congue a. + +Morbi nec condimentum dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque non dui quis nibh feugiat viverra vitae ac nunc. Nulla ullamcorper tempus nibh non vulputate. Quisque non mi non urna venenatis sollicitudin a eget ipsum. Quisque varius, nisi a lobortis eleifend, lorem diam finibus nisl, ac facilisis tortor metus non mi. Curabitur auctor condimentum orci, et tempus nunc suscipit et. Quisque sed ligula sollicitudin, ornare sapien quis, hendrerit enim. Aliquam erat volutpat. In eleifend nunc lorem, finibus vestibulum risus tempor sit amet. Fusce eget convallis tellus. Vestibulum eget arcu ac odio faucibus suscipit id bibendum ipsum. Praesent id urna nec ligula molestie molestie. + +Duis id massa ut est congue euismod vitae a est. Morbi faucibus neque nisi, ac efficitur ante vestibulum id. Mauris aliquam in felis at malesuada. Aliquam in elementum ex. Aliquam vestibulum placerat libero dapibus convallis. Nunc maximus mauris quis sem consectetur, a iaculis metus ultricies. Nam nec porta quam. Curabitur at porttitor turpis. Curabitur efficitur facilisis mauris vitae fringilla. Mauris ut libero fringilla, auctor eros vel, sagittis orci. In viverra dolor congue, iaculis massa at, gravida sem. Morbi sagittis, enim at blandit rhoncus, ligula enim laoreet dolor, nec interdum elit lacus eu sem. Duis non sollicitudin risus. Proin eget dolor faucibus, dictum sapien eget, fermentum eros. Donec eget maximus arcu. + +Sed eleifend volutpat leo, sit amet iaculis orci mollis sed. Vestibulum imperdiet dui bibendum, elementum nisl nec, tempus nulla. Donec et vulputate tortor. Nunc a nulla lacinia, pellentesque eros id, venenatis nisl. Donec pulvinar, metus id vestibulum vestibulum, sem libero venenatis odio, sed fringilla augue nunc a erat. Donec sodales, leo sit amet tempus auctor, purus sem volutpat diam, eget laoreet leo sapien at lectus. Sed consectetur ante at mauris feugiat tempus. Quisque bibendum sit amet mauris at tristique. Duis sed elit eleifend, tincidunt neque id, interdum dolor. Sed orci magna, faucibus quis purus in, egestas ultrices ipsum. Nulla efficitur lacus in tellus tincidunt, sit amet bibendum tortor luctus. Ut gravida aliquet pretium. + +Nam aliquam sapien lectus, eu feugiat lacus ullamcorper vitae. Phasellus egestas elementum odio quis blandit. Nunc efficitur est ac accumsan volutpat. Aenean convallis dui sed massa tincidunt, et viverra enim volutpat. Aliquam a libero nec nulla lacinia bibendum. Etiam a tellus eget neque suscipit luctus a lacinia nunc. Sed euismod laoreet imperdiet. Vivamus in elit bibendum mauris eleifend suscipit. Morbi finibus, nibh eu condimentum suscipit, eros arcu tincidunt odio, vitae efficitur dui lorem quis orci. Phasellus eleifend, lorem in aliquam suscipit, metus felis cursus purus, sit amet venenatis ligula sapien nec elit. Nam accumsan tincidunt magna vitae viverra. Nullam congue dolor ac tortor pretium congue. Morbi consequat erat odio, sed sollicitudin leo lacinia efficitur. + +Donec quis ornare justo. Donec vehicula fringilla pharetra. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed massa lectus, tristique accumsan consectetur ac, sodales sed lacus. Vestibulum eleifend nunc sit amet sollicitudin rhoncus. Donec id turpis id est aliquet viverra. Suspendisse et ipsum augue. In hac habitasse platea dictumst. Mauris vel tortor ligula. Duis dui risus, pharetra non nulla at, tristique pellentesque lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis tortor non dapibus pharetra. Aenean sit amet enim nec velit euismod venenatis. Donec congue efficitur mi non ultrices. Praesent in lacinia urna, nec vulputate mi. + +Proin ac sem in leo tincidunt pellentesque id ac magna. Donec finibus fermentum semper. In hac habitasse platea dictumst. Morbi varius enim molestie nulla ornare, at varius tellus varius. Cras euismod rhoncus massa sollicitudin vestibulum. Vivamus rhoncus, lectus non viverra dignissim, sem dolor molestie dui, vitae pulvinar orci leo sed nulla. Sed et ipsum nec nibh dictum mattis non eu nulla. Suspendisse interdum eu magna fermentum interdum. Etiam eu fringilla sem. Nulla hendrerit volutpat nunc a convallis. In quis condimentum lorem. Ut convallis orci non dolor posuere dignissim. Aenean a mi nisl. Maecenas dignissim scelerisque metus, sit amet viverra metus pellentesque at. Suspendisse volutpat elit id pellentesque vulputate. Proin non tempor mi. + +Duis porta enim id ipsum eleifend pharetra eu sit amet turpis. Nulla facilisi. Aliquam erat volutpat. Aenean semper blandit lacus eu venenatis. Sed imperdiet eu purus eget tristique. Phasellus sollicitudin scelerisque ipsum quis auctor. Duis ultricies quam vitae dignissim sodales. Aliquam ex lacus, iaculis vel scelerisque ac, facilisis id magna. Sed ullamcorper ante at tempus ullamcorper. + +Vivamus feugiat pulvinar elit quis blandit. Pellentesque auctor varius purus ut varius. Etiam sed massa posuere turpis consequat lobortis eget ut lacus. Etiam id arcu cursus, finibus metus a, egestas ante. Nam mattis mauris ut arcu faucibus, dapibus semper augue auctor. Nulla facilisi. Suspendisse suscipit ultricies metus, sed faucibus sapien elementum at. Phasellus vel metus vehicula, condimentum ipsum quis, convallis arcu. + +Morbi tortor magna, fringilla accumsan velit sed, gravida ultrices felis. Morbi accumsan leo molestie consectetur iaculis. Nulla neque sapien, laoreet vitae urna a, luctus sodales lacus. Sed ut odio pellentesque, dictum libero non, aliquam velit. Curabitur vel metus vulputate, pretium odio nec, suscipit massa. Suspendisse elementum est quis metus maximus ullamcorper. Vestibulum laoreet, nunc ut consequat dignissim, risus enim feugiat eros, ac bibendum libero lacus vel risus. Morbi nisi purus, accumsan quis augue a, ornare varius nisl. Nulla facilisi. Fusce porta quam et varius egestas. Integer posuere ac neque id tristique. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec molestie enim ut pretium congue. + +Vestibulum at molestie tellus. Nulla facilisi. Praesent sem odio, fringilla nec dignissim vel, commodo nec nisi. Ut quis odio diam. Praesent a turpis a magna vestibulum porttitor. Morbi vitae odio nulla. Vivamus faucibus congue accumsan. + +Proin elementum est enim, in fermentum justo malesuada vel. Curabitur non nisi ut massa tristique dictum. Duis mollis at magna eget elementum. Vivamus quis tempor mauris. Cras pulvinar, sapien a euismod vestibulum, mi metus posuere velit, at malesuada sem ipsum nec quam. Praesent sit amet euismod tortor, id sollicitudin nibh. Quisque auctor convallis tellus vitae hendrerit. Sed et odio tortor. Vivamus egestas enim non rhoncus scelerisque. + +Aenean condimentum efficitur tellus vitae dapibus. Praesent id blandit lectus, a efficitur mauris. Sed sagittis arcu a urna mattis vehicula. Aliquam volutpat nulla fermentum tortor tincidunt venenatis. Nunc pulvinar ante eget felis luctus, venenatis laoreet dolor volutpat. Aliquam augue dui, convallis ac justo id, volutpat vulputate nisl. Duis vitae leo mattis, tristique metus eu, luctus ex. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce non ante rutrum, aliquet libero et, pulvinar neque. + +Nam vehicula fringilla aliquet. Donec tincidunt egestas metus, id eleifend turpis facilisis sed. Sed mollis volutpat est ut mattis. Curabitur efficitur lorem eu ipsum aliquam ullamcorper. Donec vitae risus semper libero luctus porttitor non a neque. Aliquam sed facilisis lectus, placerat faucibus libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sed dictum est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque hendrerit ligula turpis, quis sagittis nunc ultricies eget. Nam vel metus volutpat, consequat velit et, posuere purus. Mauris sed ligula at nisi eleifend iaculis quis a urna. Duis tempus, lectus aliquam pharetra rhoncus, metus libero laoreet tortor, sed ultrices eros elit vitae libero. Aenean sit amet dignissim felis. In vel sapien ac massa pellentesque egestas. + +Proin sed tortor volutpat, lobortis quam sit amet, molestie dui. Suspendisse nec eros at nulla ultricies congue. Sed sit amet urna sed justo fermentum consequat vitae sed leo. Nunc maximus, felis non pulvinar hendrerit, leo orci imperdiet nisl, vitae mattis turpis leo ac justo. Nam quis nisl ut sem rhoncus iaculis ut eget erat. Phasellus imperdiet vitae tortor ac auctor. Fusce luctus nibh sit amet dolor pellentesque porttitor. Curabitur vitae gravida ex, in vulputate justo. Duis eu suscipit nibh. Donec aliquam dui gravida accumsan porta. Duis eu sapien elit. Aliquam tellus massa, tempor eget dui nec, pellentesque rutrum erat. Pellentesque eget orci id dui luctus auctor. + +Aenean vehicula vel justo nec lacinia. Donec sodales pretium leo eu viverra. Aenean eu mi dolor. Fusce venenatis finibus felis elementum malesuada. Nullam sit amet tristique ex, non sollicitudin dui. Nulla lacinia dolor sit amet ante commodo, nec suscipit dolor ultricies. Donec at nibh nec enim tincidunt molestie. + +Sed finibus vehicula sagittis. Sed sodales convallis posuere. Proin porta mi vel bibendum fringilla. Nullam suscipit nisl ut orci tincidunt, sed semper purus vestibulum. Maecenas blandit ullamcorper porttitor. Duis quis euismod mi. Proin eget volutpat metus, ut viverra quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse augue libero, fermentum tempus mi id, rhoncus pharetra ipsum. Morbi consequat ultrices lacus, vel pharetra eros tempor a. Nulla in hendrerit lacus. Nam purus odio, feugiat quis ullamcorper at, vehicula sit amet erat. Ut orci diam, porttitor in odio nec, sagittis commodo elit. Aenean ipsum magna, finibus at blandit vitae, posuere id eros. Curabitur neque enim, tristique a urna eu, fermentum varius felis. Nulla facilisi. + +Curabitur placerat et nibh a pulvinar. Donec placerat metus leo, sit amet consequat sem consequat vitae. Morbi in lacus id dolor fringilla luctus sit amet a metus. Nullam nec odio non lectus facilisis feugiat. Quisque et faucibus nulla. Cras quis est id erat rutrum commodo. Maecenas porta odio et mi viverra commodo. Nulla placerat nec arcu vel pellentesque. Donec dignissim consectetur quam interdum porttitor. Quisque sit amet rhoncus nibh, ac imperdiet ante. Suspendisse sapien ante, tincidunt et nulla dictum, vehicula ullamcorper quam. Morbi commodo condimentum egestas. Quisque velit tellus, suscipit vel mi at, ullamcorper venenatis ligula. Pellentesque malesuada auctor blandit. Proin faucibus finibus euismod. Ut in erat at neque porttitor sagittis vehicula a enim. + +Phasellus sit amet gravida ligula. Aenean aliquet, nibh imperdiet dictum elementum, massa dolor ultricies nibh, ut sodales dolor justo eu mi. Vestibulum commodo tellus ac sem aliquet, et sagittis neque tristique. Sed molestie nisl justo, nec laoreet augue facilisis in. Maecenas vel malesuada arcu, a maximus arcu. Sed porttitor orci ac nisi efficitur laoreet. Proin ut aliquet arcu. Curabitur in porta nunc. Curabitur eleifend molestie porttitor. Duis ut mollis ante, non congue massa. In ante mi, condimentum a tortor ut, cursus tincidunt erat. Maecenas rutrum fringilla sagittis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse augue erat, gravida ac fermentum nec, malesuada at diam. Cras eget aliquet nulla, id pulvinar sapien. Aliquam malesuada sem eget nibh eleifend tincidunt. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum non sodales purus. Nullam magna massa, porttitor in nisl a, ultrices varius nunc. Nunc convallis dui et justo sollicitudin aliquet. Cras placerat congue orci ut gravida. Sed et neque ut augue lobortis pellentesque. Integer feugiat tincidunt risus, ac porttitor eros pretium at. Vivamus vitae dictum est, ut fringilla odio. Maecenas hendrerit, est eget malesuada rhoncus, quam mauris ullamcorper mi, id fermentum nibh risus a ex. Integer et gravida orci. + +Quisque molestie quis augue sed posuere. Vestibulum non dolor eros. Curabitur porttitor est at volutpat iaculis. Mauris in fermentum diam, a maximus velit. Maecenas pharetra bibendum libero et aliquam. Praesent eu scelerisque urna, nec bibendum risus. Quisque et eros id quam accumsan aliquet id non libero. Fusce ac molestie enim. Nam vitae efficitur nisi, ac placerat lacus. Morbi mollis bibendum efficitur. Fusce quis efficitur nunc. Morbi a euismod dolor, ut ultrices urna. Mauris suscipit congue enim non bibendum. Cras eget tincidunt ante. Quisque non augue fringilla, hendrerit velit ut, vehicula velit. Cras sollicitudin, sem non lacinia placerat, massa felis porttitor tortor, in luctus arcu mauris id leo. + +Suspendisse aliquet eu est quis blandit. Quisque sit amet ligula nec leo dapibus consectetur at id elit. Ut quis ligula vulputate, euismod sapien eget, luctus orci. Duis porttitor tellus urna, id pretium lectus tempus non. Pellentesque sit amet tellus sapien. In consequat vitae nisl sed feugiat. Phasellus diam lectus, commodo et lacinia ut, vestibulum non erat. In eget lobortis lorem. Aenean interdum nibh eget nibh luctus mollis. Integer ac nisl at augue placerat mattis a at libero. Vivamus varius, tellus non dapibus lacinia, velit justo auctor justo, in blandit odio velit tristique est. Morbi iaculis mauris et tempus vehicula. Pellentesque ultricies placerat dapibus. + +Nullam pellentesque euismod malesuada. Aliquam erat volutpat. Cras commodo nisl eget molestie interdum. Mauris enim lorem, pharetra non mollis quis, feugiat vitae mi. Maecenas ante ante, aliquam ac quam sit amet, vestibulum rutrum nunc. Sed eget purus et lorem luctus maximus. Vivamus lobortis sapien vitae lacinia consequat. Nunc sed nisi justo. Sed eu purus tempor ipsum sagittis iaculis. Nam ultricies lorem sit amet mi lobortis, id condimentum turpis aliquet. Etiam ullamcorper ultrices volutpat. Vestibulum id ullamcorper leo. + +Curabitur nec nibh ac velit auctor laoreet. Aliquam erat volutpat. Sed vel volutpat sem, at finibus elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas feugiat ornare lacus pretium ultricies. Vestibulum tincidunt quam non diam efficitur eleifend. Donec eleifend nunc dui, et feugiat elit tempor a. Mauris erat libero, accumsan at elit at, scelerisque convallis ligula. Cras ullamcorper eros lorem, vitae cursus augue tristique eu. + +Sed sed consectetur nibh. Morbi accumsan luctus gravida. Etiam eget mi rutrum, sagittis felis rutrum, viverra sem. Nam consectetur quam sem, elementum dapibus nulla efficitur sit amet. Donec quis tristique metus. Vestibulum lacinia augue vel justo efficitur, at imperdiet augue commodo. Curabitur vulputate laoreet rutrum. Nam lobortis, est sit amet vulputate suscipit, velit dui tincidunt lorem, vel feugiat quam arcu non tellus. Maecenas ullamcorper ex ac dui volutpat, a mattis magna bibendum. Fusce id viverra elit, eu egestas turpis. Vestibulum varius faucibus arcu a eleifend. Vivamus ut urna eget massa auctor auctor ultrices at libero. Vestibulum ut efficitur mi. Ut molestie malesuada quam, ac aliquam ex congue a. + +Morbi nec condimentum dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque non dui quis nibh feugiat viverra vitae ac nunc. Nulla ullamcorper tempus nibh non vulputate. Quisque non mi non urna venenatis sollicitudin a eget ipsum. Quisque varius, nisi a lobortis eleifend, lorem diam finibus nisl, ac facilisis tortor metus non mi. Curabitur auctor condimentum orci, et tempus nunc suscipit et. Quisque sed ligula sollicitudin, ornare sapien quis, hendrerit enim. Aliquam erat volutpat. In eleifend nunc lorem, finibus vestibulum risus tempor sit amet. Fusce eget convallis tellus. Vestibulum eget arcu ac odio faucibus suscipit id bibendum ipsum. Praesent id urna nec ligula molestie molestie. + +Duis id massa ut est congue euismod vitae a est. Morbi faucibus neque nisi, ac efficitur ante vestibulum id. Mauris aliquam in felis at malesuada. Aliquam in elementum ex. Aliquam vestibulum placerat libero dapibus convallis. Nunc maximus mauris quis sem consectetur, a iaculis metus ultricies. Nam nec porta quam. Curabitur at porttitor turpis. Curabitur efficitur facilisis mauris vitae fringilla. Mauris ut libero fringilla, auctor eros vel, sagittis orci. In viverra dolor congue, iaculis massa at, gravida sem. Morbi sagittis, enim at blandit rhoncus, ligula enim laoreet dolor, nec interdum elit lacus eu sem. Duis non sollicitudin risus. Proin eget dolor faucibus, dictum sapien eget, fermentum eros. Donec eget maximus arcu. + +Sed eleifend volutpat leo, sit amet iaculis orci mollis sed. Vestibulum imperdiet dui bibendum, elementum nisl nec, tempus nulla. Donec et vulputate tortor. Nunc a nulla lacinia, pellentesque eros id, venenatis nisl. Donec pulvinar, metus id vestibulum vestibulum, sem libero venenatis odio, sed fringilla augue nunc a erat. Donec sodales, leo sit amet tempus auctor, purus sem volutpat diam, eget laoreet leo sapien at lectus. Sed consectetur ante at mauris feugiat tempus. Quisque bibendum sit amet mauris at tristique. Duis sed elit eleifend, tincidunt neque id, interdum dolor. Sed orci magna, faucibus quis purus in, egestas ultrices ipsum. Nulla efficitur lacus in tellus tincidunt, sit amet bibendum tortor luctus. Ut gravida aliquet pretium. + +Nam aliquam sapien lectus, eu feugiat lacus ullamcorper vitae. Phasellus egestas elementum odio quis blandit. Nunc efficitur est ac accumsan volutpat. Aenean convallis dui sed massa tincidunt, et viverra enim volutpat. Aliquam a libero nec nulla lacinia bibendum. Etiam a tellus eget neque suscipit luctus a lacinia nunc. Sed euismod laoreet imperdiet. Vivamus in elit bibendum mauris eleifend suscipit. Morbi finibus, nibh eu condimentum suscipit, eros arcu tincidunt odio, vitae efficitur dui lorem quis orci. Phasellus eleifend, lorem in aliquam suscipit, metus felis cursus purus, sit amet venenatis ligula sapien nec elit. Nam accumsan tincidunt magna vitae viverra. Nullam congue dolor ac tortor pretium congue. Morbi consequat erat odio, sed sollicitudin leo lacinia efficitur. + +Donec quis ornare justo. Donec vehicula fringilla pharetra. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed massa lectus, tristique accumsan consectetur ac, sodales sed lacus. Vestibulum eleifend nunc sit amet sollicitudin rhoncus. Donec id turpis id est aliquet viverra. Suspendisse et ipsum augue. In hac habitasse platea dictumst. Mauris vel tortor ligula. Duis dui risus, pharetra non nulla at, tristique pellentesque lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis tortor non dapibus pharetra. Aenean sit amet enim nec velit euismod venenatis. Donec congue efficitur mi non ultrices. Praesent in lacinia urna, nec vulputate mi. + +Proin ac sem in leo tincidunt pellentesque id ac magna. Donec finibus fermentum semper. In hac habitasse platea dictumst. Morbi varius enim molestie nulla ornare, at varius tellus varius. Cras euismod rhoncus massa sollicitudin vestibulum. Vivamus rhoncus, lectus non viverra dignissim, sem dolor molestie dui, vitae pulvinar orci leo sed nulla. Sed et ipsum nec nibh dictum mattis non eu nulla. Suspendisse interdum eu magna fermentum interdum. Etiam eu fringilla sem. Nulla hendrerit volutpat nunc a convallis. In quis condimentum lorem. Ut convallis orci non dolor posuere dignissim. Aenean a mi nisl. Maecenas dignissim scelerisque metus, sit amet viverra metus pellentesque at. Suspendisse volutpat elit id pellentesque vulputate. Proin non tempor mi. + +Duis porta enim id ipsum eleifend pharetra eu sit amet turpis. Nulla facilisi. Aliquam erat volutpat. Aenean semper blandit lacus eu venenatis. Sed imperdiet eu purus eget tristique. Phasellus sollicitudin scelerisque ipsum quis auctor. Duis ultricies quam vitae dignissim sodales. Aliquam ex lacus, iaculis vel scelerisque ac, facilisis id magna. Sed ullamcorper ante at tempus ullamcorper. + +Vivamus feugiat pulvinar elit quis blandit. Pellentesque auctor varius purus ut varius. Etiam sed massa posuere turpis consequat lobortis eget ut lacus. Etiam id arcu cursus, finibus metus a, egestas ante. Nam mattis mauris ut arcu faucibus, dapibus semper augue auctor. Nulla facilisi. Suspendisse suscipit ultricies metus, sed faucibus sapien elementum at. Phasellus vel metus vehicula, condimentum ipsum quis, convallis arcu. + +Morbi tortor magna, fringilla accumsan velit sed, gravida ultrices felis. Morbi accumsan leo molestie consectetur iaculis. Nulla neque sapien, laoreet vitae urna a, luctus sodales lacus. Sed ut odio pellentesque, dictum libero non, aliquam velit. Curabitur vel metus vulputate, pretium odio nec, suscipit massa. Suspendisse elementum est quis metus maximus ullamcorper. Vestibulum laoreet, nunc ut consequat dignissim, risus enim feugiat eros, ac bibendum libero lacus vel risus. Morbi nisi purus, accumsan quis augue a, ornare varius nisl. Nulla facilisi. Fusce porta quam et varius egestas. Integer posuere ac neque id tristique. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec molestie enim ut pretium congue. + +Vestibulum at molestie tellus. Nulla facilisi. Praesent sem odio, fringilla nec dignissim vel, commodo nec nisi. Ut quis odio diam. Praesent a turpis a magna vestibulum porttitor. Morbi vitae odio nulla. Vivamus faucibus congue accumsan. + +Proin elementum est enim, in fermentum justo malesuada vel. Curabitur non nisi ut massa tristique dictum. Duis mollis at magna eget elementum. Vivamus quis tempor mauris. Cras pulvinar, sapien a euismod vestibulum, mi metus posuere velit, at malesuada sem ipsum nec quam. Praesent sit amet euismod tortor, id sollicitudin nibh. Quisque auctor convallis tellus vitae hendrerit. Sed et odio tortor. Vivamus egestas enim non rhoncus scelerisque. + +Aenean condimentum efficitur tellus vitae dapibus. Praesent id blandit lectus, a efficitur mauris. Sed sagittis arcu a urna mattis vehicula. Aliquam volutpat nulla fermentum tortor tincidunt venenatis. Nunc pulvinar ante eget felis luctus, venenatis laoreet dolor volutpat. Aliquam augue dui, convallis ac justo id, volutpat vulputate nisl. Duis vitae leo mattis, tristique metus eu, luctus ex. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce non ante rutrum, aliquet libero et, pulvinar neque. + +Nam vehicula fringilla aliquet. Donec tincidunt egestas metus, id eleifend turpis facilisis sed. Sed mollis volutpat est ut mattis. Curabitur efficitur lorem eu ipsum aliquam ullamcorper. Donec vitae risus semper libero luctus porttitor non a neque. Aliquam sed facilisis lectus, placerat faucibus libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sed dictum est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque hendrerit ligula turpis, quis sagittis nunc ultricies eget. Nam vel metus volutpat, consequat velit et, posuere purus. Mauris sed ligula at nisi eleifend iaculis quis a urna. Duis tempus, lectus aliquam pharetra rhoncus, metus libero laoreet tortor, sed ultrices eros elit vitae libero. Aenean sit amet dignissim felis. In vel sapien ac massa pellentesque egestas. + +Proin sed tortor volutpat, lobortis quam sit amet, molestie dui. Suspendisse nec eros at nulla ultricies congue. Sed sit amet urna sed justo fermentum consequat vitae sed leo. Nunc maximus, felis non pulvinar hendrerit, leo orci imperdiet nisl, vitae mattis turpis leo ac justo. Nam quis nisl ut sem rhoncus iaculis ut eget erat. Phasellus imperdiet vitae tortor ac auctor. Fusce luctus nibh sit amet dolor pellentesque porttitor. Curabitur vitae gravida ex, in vulputate justo. Duis eu suscipit nibh. Donec aliquam dui gravida accumsan porta. Duis eu sapien elit. Aliquam tellus massa, tempor eget dui nec, pellentesque rutrum erat. Pellentesque eget orci id dui luctus auctor. + +Aenean vehicula vel justo nec lacinia. Donec sodales pretium leo eu viverra. Aenean eu mi dolor. Fusce venenatis finibus felis elementum malesuada. Nullam sit amet tristique ex, non sollicitudin dui. Nulla lacinia dolor sit amet ante commodo, nec suscipit dolor ultricies. Donec at nibh nec enim tincidunt molestie. + +Sed finibus vehicula sagittis. Sed sodales convallis posuere. Proin porta mi vel bibendum fringilla. Nullam suscipit nisl ut orci tincidunt, sed semper purus vestibulum. Maecenas blandit ullamcorper porttitor. Duis quis euismod mi. Proin eget volutpat metus, ut viverra quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse augue libero, fermentum tempus mi id, rhoncus pharetra ipsum. Morbi consequat ultrices lacus, vel pharetra eros tempor a. Nulla in hendrerit lacus. Nam purus odio, feugiat quis ullamcorper at, vehicula sit amet erat. Ut orci diam, porttitor in odio nec, sagittis commodo elit. Aenean ipsum magna, finibus at blandit vitae, posuere id eros. Curabitur neque enim, tristique a urna eu, fermentum varius felis. Nulla facilisi. + +Curabitur placerat et nibh a pulvinar. Donec placerat metus leo, sit amet consequat sem consequat vitae. Morbi in lacus id dolor fringilla luctus sit amet a metus. Nullam nec odio non lectus facilisis feugiat. Quisque et faucibus nulla. Cras quis est id erat rutrum commodo. Maecenas porta odio et mi viverra commodo. Nulla placerat nec arcu vel pellentesque. Donec dignissim consectetur quam interdum porttitor. Quisque sit amet rhoncus nibh, ac imperdiet ante. Suspendisse sapien ante, tincidunt et nulla dictum, vehicula ullamcorper quam. Morbi commodo condimentum egestas. Quisque velit tellus, suscipit vel mi at, ullamcorper venenatis ligula. Pellentesque malesuada auctor blandit. Proin faucibus finibus euismod. Ut in erat at neque porttitor sagittis vehicula a enim. + +Phasellus sit amet gravida ligula. Aenean aliquet, nibh imperdiet dictum elementum, massa dolor ultricies nibh, ut sodales dolor justo eu mi. Vestibulum commodo tellus ac sem aliquet, et sagittis neque tristique. Sed molestie nisl justo, nec laoreet augue facilisis in. Maecenas vel malesuada arcu, a maximus arcu. Sed porttitor orci ac nisi efficitur laoreet. Proin ut aliquet arcu. Curabitur in porta nunc. Curabitur eleifend molestie porttitor. Duis ut mollis ante, non congue massa. In ante mi, condimentum a tortor ut, cursus tincidunt erat. Maecenas rutrum fringilla sagittis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse augue erat, gravida ac fermentum nec, malesuada at diam. Cras eget aliquet nulla, id pulvinar sapien. Aliquam malesuada sem eget nibh eleifend tincidunt. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum non sodales purus. Nullam magna massa, porttitor in nisl a, ultrices varius nunc. Nunc convallis dui et justo sollicitudin aliquet. Cras placerat congue orci ut gravida. Sed et neque ut augue lobortis pellentesque. Integer feugiat tincidunt risus, ac porttitor eros pretium at. Vivamus vitae dictum est, ut fringilla odio. Maecenas hendrerit, est eget malesuada rhoncus, quam mauris ullamcorper mi, id fermentum nibh risus a ex. Integer et gravida orci. + +Quisque molestie quis augue sed posuere. Vestibulum non dolor eros. Curabitur porttitor est at volutpat iaculis. Mauris in fermentum diam, a maximus velit. Maecenas pharetra bibendum libero et aliquam. Praesent eu scelerisque urna, nec bibendum risus. Quisque et eros id quam accumsan aliquet id non libero. Fusce ac molestie enim. Nam vitae efficitur nisi, ac placerat lacus. Morbi mollis bibendum efficitur. Fusce quis efficitur nunc. Morbi a euismod dolor, ut ultrices urna. Mauris suscipit congue enim non bibendum. Cras eget tincidunt ante. Quisque non augue fringilla, hendrerit velit ut, vehicula velit. Cras sollicitudin, sem non lacinia placerat, massa felis porttitor tortor, in luctus arcu mauris id leo. + +Suspendisse aliquet eu est quis blandit. Quisque sit amet ligula nec leo dapibus consectetur at id elit. Ut quis ligula vulputate, euismod sapien eget, luctus orci. Duis porttitor tellus urna, id pretium lectus tempus non. Pellentesque sit amet tellus sapien. In consequat vitae nisl sed feugiat. Phasellus diam lectus, commodo et lacinia ut, vestibulum non erat. In eget lobortis lorem. Aenean interdum nibh eget nibh luctus mollis. Integer ac nisl at augue placerat mattis a at libero. Vivamus varius, tellus non dapibus lacinia, velit justo auctor justo, in blandit odio velit tristique est. Morbi iaculis mauris et tempus vehicula. Pellentesque ultricies placerat dapibus. + +Nullam pellentesque euismod malesuada. Aliquam erat volutpat. Cras commodo nisl eget molestie interdum. Mauris enim lorem, pharetra non mollis quis, feugiat vitae mi. Maecenas ante ante, aliquam ac quam sit amet, vestibulum rutrum nunc. Sed eget purus et lorem luctus maximus. Vivamus lobortis sapien vitae lacinia consequat. Nunc sed nisi justo. Sed eu purus tempor ipsum sagittis iaculis. Nam ultricies lorem sit amet mi lobortis, id condimentum turpis aliquet. Etiam ullamcorper ultrices volutpat. Vestibulum id ullamcorper leo. + +Curabitur nec nibh ac velit auctor laoreet. Aliquam erat volutpat. Sed vel volutpat sem, at finibus elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas feugiat ornare lacus pretium ultricies. Vestibulum tincidunt quam non diam efficitur eleifend. Donec eleifend nunc dui, et feugiat elit tempor a. Mauris erat libero, accumsan at elit at, scelerisque convallis ligula. Cras ullamcorper eros lorem, vitae cursus augue tristique eu. + +Sed sed consectetur nibh. Morbi accumsan luctus gravida. Etiam eget mi rutrum, sagittis felis rutrum, viverra sem. Nam consectetur quam sem, elementum dapibus nulla efficitur sit amet. Donec quis tristique metus. Vestibulum lacinia augue vel justo efficitur, at imperdiet augue commodo. Curabitur vulputate laoreet rutrum. Nam lobortis, est sit amet vulputate suscipit, velit dui tincidunt lorem, vel feugiat quam arcu non tellus. Maecenas ullamcorper ex ac dui volutpat, a mattis magna bibendum. Fusce id viverra elit, eu egestas turpis. Vestibulum varius faucibus arcu a eleifend. Vivamus ut urna eget massa auctor auctor ultrices at libero. Vestibulum ut efficitur mi. Ut molestie malesuada quam, ac aliquam ex congue a. + +Morbi nec condimentum dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque non dui quis nibh feugiat viverra vitae ac nunc. Nulla ullamcorper tempus nibh non vulputate. Quisque non mi non urna venenatis sollicitudin a eget ipsum. Quisque varius, nisi a lobortis eleifend, lorem diam finibus nisl, ac facilisis tortor metus non mi. Curabitur auctor condimentum orci, et tempus nunc suscipit et. Quisque sed ligula sollicitudin, ornare sapien quis, hendrerit enim. Aliquam erat volutpat. In eleifend nunc lorem, finibus vestibulum risus tempor sit amet. Fusce eget convallis tellus. Vestibulum eget arcu ac odio faucibus suscipit id bibendum ipsum. Praesent id urna nec ligula molestie molestie. + +Duis id massa ut est congue euismod vitae a est. Morbi faucibus neque nisi, ac efficitur ante vestibulum id. Mauris aliquam in felis at malesuada. Aliquam in elementum ex. Aliquam vestibulum placerat libero dapibus convallis. Nunc maximus mauris quis sem consectetur, a iaculis metus ultricies. Nam nec porta quam. Curabitur at porttitor turpis. Curabitur efficitur facilisis mauris vitae fringilla. Mauris ut libero fringilla, auctor eros vel, sagittis orci. In viverra dolor congue, iaculis massa at, gravida sem. Morbi sagittis, enim at blandit rhoncus, ligula enim laoreet dolor, nec interdum elit lacus eu sem. Duis non sollicitudin risus. Proin eget dolor faucibus, dictum sapien eget, fermentum eros. Donec eget maximus arcu. + +Sed eleifend volutpat leo, sit amet iaculis orci mollis sed. Vestibulum imperdiet dui bibendum, elementum nisl nec, tempus nulla. Donec et vulputate tortor. Nunc a nulla lacinia, pellentesque eros id, venenatis nisl. Donec pulvinar, metus id vestibulum vestibulum, sem libero venenatis odio, sed fringilla augue nunc a erat. Donec sodales, leo sit amet tempus auctor, purus sem volutpat diam, eget laoreet leo sapien at lectus. Sed consectetur ante at mauris feugiat tempus. Quisque bibendum sit amet mauris at tristique. Duis sed elit eleifend, tincidunt neque id, interdum dolor. Sed orci magna, faucibus quis purus in, egestas ultrices ipsum. Nulla efficitur lacus in tellus tincidunt, sit amet bibendum tortor luctus. Ut gravida aliquet pretium. + +Nam aliquam sapien lectus, eu feugiat lacus ullamcorper vitae. Phasellus egestas elementum odio quis blandit. Nunc efficitur est ac accumsan volutpat. Aenean convallis dui sed massa tincidunt, et viverra enim volutpat. Aliquam a libero nec nulla lacinia bibendum. Etiam a tellus eget neque suscipit luctus a lacinia nunc. Sed euismod laoreet imperdiet. Vivamus in elit bibendum mauris eleifend suscipit. Morbi finibus, nibh eu condimentum suscipit, eros arcu tincidunt odio, vitae efficitur dui lorem quis orci. Phasellus eleifend, lorem in aliquam suscipit, metus felis cursus purus, sit amet venenatis ligula sapien nec elit. Nam accumsan tincidunt magna vitae viverra. Nullam congue dolor ac tortor pretium congue. Morbi consequat erat odio, sed sollicitudin leo lacinia efficitur. + +Donec quis ornare justo. Donec vehicula fringilla pharetra. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed massa lectus, tristique accumsan consectetur ac, sodales sed lacus. Vestibulum eleifend nunc sit amet sollicitudin rhoncus. Donec id turpis id est aliquet viverra. Suspendisse et ipsum augue. In hac habitasse platea dictumst. Mauris vel tortor ligula. Duis dui risus, pharetra non nulla at, tristique pellentesque lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis tortor non dapibus pharetra. Aenean sit amet enim nec velit euismod venenatis. Donec congue efficitur mi non ultrices. Praesent in lacinia urna, nec vulputate mi. + +Proin ac sem in leo tincidunt pellentesque id ac magna. Donec finibus fermentum semper. In hac habitasse platea dictumst. Morbi varius enim molestie nulla ornare, at varius tellus varius. Cras euismod rhoncus massa sollicitudin vestibulum. Vivamus rhoncus, lectus non viverra dignissim, sem dolor molestie dui, vitae pulvinar orci leo sed nulla. Sed et ipsum nec nibh dictum mattis non eu nulla. Suspendisse interdum eu magna fermentum interdum. Etiam eu fringilla sem. Nulla hendrerit volutpat nunc a convallis. In quis condimentum lorem. Ut convallis orci non dolor posuere dignissim. Aenean a mi nisl. Maecenas dignissim scelerisque metus, sit amet viverra metus pellentesque at. Suspendisse volutpat elit id pellentesque vulputate. Proin non tempor mi. + +Duis porta enim id ipsum eleifend pharetra eu sit amet turpis. Nulla facilisi. Aliquam erat volutpat. Aenean semper blandit lacus eu venenatis. Sed imperdiet eu purus eget tristique. Phasellus sollicitudin scelerisque ipsum quis auctor. Duis ultricies quam vitae dignissim sodales. Aliquam ex lacus, iaculis vel scelerisque ac, facilisis id magna. Sed ullamcorper ante at tempus ullamcorper. + +Vivamus feugiat pulvinar elit quis blandit. Pellentesque auctor varius purus ut varius. Etiam sed massa posuere turpis consequat lobortis eget ut lacus. Etiam id arcu cursus, finibus metus a, egestas ante. Nam mattis mauris ut arcu faucibus, dapibus semper augue auctor. Nulla facilisi. Suspendisse suscipit ultricies metus, sed faucibus sapien elementum at. Phasellus vel metus vehicula, condimentum ipsum quis, convallis arcu. + +Morbi tortor magna, fringilla accumsan velit sed, gravida ultrices felis. Morbi accumsan leo molestie consectetur iaculis. Nulla neque sapien, laoreet vitae urna a, luctus sodales lacus. Sed ut odio pellentesque, dictum libero non, aliquam velit. Curabitur vel metus vulputate, pretium odio nec, suscipit massa. Suspendisse elementum est quis metus maximus ullamcorper. Vestibulum laoreet, nunc ut consequat dignissim, risus enim feugiat eros, ac bibendum libero lacus vel risus. Morbi nisi purus, accumsan quis augue a, ornare varius nisl. Nulla facilisi. Fusce porta quam et varius egestas. Integer posuere ac neque id tristique. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec molestie enim ut pretium congue. + +Vestibulum at molestie tellus. Nulla facilisi. Praesent sem odio, fringilla nec dignissim vel, commodo nec nisi. Ut quis odio diam. Praesent a turpis a magna vestibulum porttitor. Morbi vitae odio nulla. Vivamus faucibus congue accumsan. + +Proin elementum est enim, in fermentum justo malesuada vel. Curabitur non nisi ut massa tristique dictum. Duis mollis at magna eget elementum. Vivamus quis tempor mauris. Cras pulvinar, sapien a euismod vestibulum, mi metus posuere velit, at malesuada sem ipsum nec quam. Praesent sit amet euismod tortor, id sollicitudin nibh. Quisque auctor convallis tellus vitae hendrerit. Sed et odio tortor. Vivamus egestas enim non rhoncus scelerisque. + +Aenean condimentum efficitur tellus vitae dapibus. Praesent id blandit lectus, a efficitur mauris. Sed sagittis arcu a urna mattis vehicula. Aliquam volutpat nulla fermentum tortor tincidunt venenatis. Nunc pulvinar ante eget felis luctus, venenatis laoreet dolor volutpat. Aliquam augue dui, convallis ac justo id, volutpat vulputate nisl. Duis vitae leo mattis, tristique metus eu, luctus ex. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce non ante rutrum, aliquet libero et, pulvinar neque. + +Nam vehicula fringilla aliquet. Donec tincidunt egestas metus, id eleifend turpis facilisis sed. Sed mollis volutpat est ut mattis. Curabitur efficitur lorem eu ipsum aliquam ullamcorper. Donec vitae risus semper libero luctus porttitor non a neque. Aliquam sed facilisis lectus, placerat faucibus libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sed dictum est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque hendrerit ligula turpis, quis sagittis nunc ultricies eget. Nam vel metus volutpat, consequat velit et, posuere purus. Mauris sed ligula at nisi eleifend iaculis quis a urna. Duis tempus, lectus aliquam pharetra rhoncus, metus libero laoreet tortor, sed ultrices eros elit vitae libero. Aenean sit amet dignissim felis. In vel sapien ac massa pellentesque egestas. + +Proin sed tortor volutpat, lobortis quam sit amet, molestie dui. Suspendisse nec eros at nulla ultricies congue. Sed sit amet urna sed justo fermentum consequat vitae sed leo. Nunc maximus, felis non pulvinar hendrerit, leo orci imperdiet nisl, vitae mattis turpis leo ac justo. Nam quis nisl ut sem rhoncus iaculis ut eget erat. Phasellus imperdiet vitae tortor ac auctor. Fusce luctus nibh sit amet dolor pellentesque porttitor. Curabitur vitae gravida ex, in vulputate justo. Duis eu suscipit nibh. Donec aliquam dui gravida accumsan porta. Duis eu sapien elit. Aliquam tellus massa, tempor eget dui nec, pellentesque rutrum erat. Pellentesque eget orci id dui luctus auctor. + +Aenean vehicula vel justo nec lacinia. Donec sodales pretium leo eu viverra. Aenean eu mi dolor. Fusce venenatis finibus felis elementum malesuada. Nullam sit amet tristique ex, non sollicitudin dui. Nulla lacinia dolor sit amet ante commodo, nec suscipit dolor ultricies. Donec at nibh nec enim tincidunt molestie. + +Sed finibus vehicula sagittis. Sed sodales convallis posuere. Proin porta mi vel bibendum fringilla. Nullam suscipit nisl ut orci tincidunt, sed semper purus vestibulum. Maecenas blandit ullamcorper porttitor. Duis quis euismod mi. Proin eget volutpat metus, ut viverra quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse augue libero, fermentum tempus mi id, rhoncus pharetra ipsum. Morbi consequat ultrices lacus, vel pharetra eros tempor a. Nulla in hendrerit lacus. Nam purus odio, feugiat quis ullamcorper at, vehicula sit amet erat. Ut orci diam, porttitor in odio nec, sagittis commodo elit. Aenean ipsum magna, finibus at blandit vitae, posuere id eros. Curabitur neque enim, tristique a urna eu, fermentum varius felis. Nulla facilisi. + +Curabitur placerat et nibh a pulvinar. Donec placerat metus leo, sit amet consequat sem consequat vitae. Morbi in lacus id dolor fringilla luctus sit amet a metus. Nullam nec odio non lectus facilisis feugiat. Quisque et faucibus nulla. Cras quis est id erat rutrum commodo. Maecenas porta odio et mi viverra commodo. Nulla placerat nec arcu vel pellentesque. Donec dignissim consectetur quam interdum porttitor. Quisque sit amet rhoncus nibh, ac imperdiet ante. Suspendisse sapien ante, tincidunt et nulla dictum, vehicula ullamcorper quam. Morbi commodo condimentum egestas. Quisque velit tellus, suscipit vel mi at, ullamcorper venenatis ligula. Pellentesque malesuada auctor blandit. Proin faucibus finibus euismod. Ut in erat at neque porttitor sagittis vehicula a enim. + +Phasellus sit amet gravida ligula. Aenean aliquet, nibh imperdiet dictum elementum, massa dolor ultricies nibh, ut sodales dolor justo eu mi. Vestibulum commodo tellus ac sem aliquet, et sagittis neque tristique. Sed molestie nisl justo, nec laoreet augue facilisis in. Maecenas vel malesuada arcu, a maximus arcu. Sed porttitor orci ac nisi efficitur laoreet. Proin ut aliquet arcu. Curabitur in porta nunc. Curabitur eleifend molestie porttitor. Duis ut mollis ante, non congue massa. In ante mi, condimentum a tortor ut, cursus tincidunt erat. Maecenas rutrum fringilla sagittis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse augue erat, gravida ac fermentum nec, malesuada at diam. Cras eget aliquet nulla, id pulvinar sapien. Aliquam malesuada sem eget nibh eleifend tincidunt. diff --git a/benches/many.rs b/benches/many.rs new file mode 100644 index 0000000..a14755b --- /dev/null +++ b/benches/many.rs @@ -0,0 +1,32 @@ +// hyperfine "cargo clean && cargo bench --bench many --no-run" + +const T: &str = "testing123\n"; +const MANY: &str = constcat::concat!( + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, +); + +fn main() { + let expected = { + let mut s = String::new(); + for _ in 0..512 { + s.push_str(T); + } + s + }; + assert_eq!(MANY, expected); +} diff --git a/src/lib.rs b/src/lib.rs index d4d808a..12a0a25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -76,13 +76,15 @@ //! //! ## MSRV //! -//! This crate supports Rust 1.60 and above. +//! This crate supports Rust 1.66 and above. #![no_std] #[doc(hidden)] pub use core; +use core::mem::MaybeUninit; + //////////////////////////////////////////////////////////////////////////////// // concat! //////////////////////////////////////////////////////////////////////////////// @@ -256,9 +258,9 @@ macro_rules! _concat_slices { }}; ([$T:ty]: $($s:expr),+) => {{ + use $crate::core::mem; use $crate::core::mem::MaybeUninit; use $crate::core::primitive::{u8, usize}; - use $crate::core::mem; $( const _: &[$T] = $s; // require constants )* @@ -267,41 +269,63 @@ macro_rules! _concat_slices { const ZERO: TypeAsBytes<$T> = TypeAsBytes { bytes: [0; TSIZE] }; const LEN: usize = $( $s.len() + )* 0; const ARR: [$T; LEN] = { - // Ideally we should use MaybeUninit::zeroed() but we want to - // support older versions of Rust. - let mut arr: [MaybeUninit<$T>; LEN] = [ unsafe { ZERO.inner }; LEN]; - let mut base: usize = 0; - $({ - let mut i = 0; - while i < $s.len() { - // Ideally this should use `MaybeUninit::write` once it is - // made const. - // Documentation: https://doc.rust-lang.org/core/mem/union.MaybeUninit.html#method.write - // Tracking issue: https://github.com/rust-lang/rust/issues/63567 - arr[base + i] = MaybeUninit::new($s[i]); - i += 1; - } - base += $s.len(); - })* - if base != LEN { panic!("invalid length"); } + let arr = $crate::concat::( + // SAFETY: + // This is safe because we are initializing a `MaybeUninit` and + // all values are overwritten before being read. + // + // Ideally we should use MaybeUninit::zeroed() but we want to + // support older versions of Rust and that was only stabilized + // in Rust 1.75. + unsafe { ZERO.inner }, + &[$($s),+] + ); // SAFETY: // As per the documentation of `core::mem::MaybeUninit`: // // - // MaybeUninit is guaranteed to have the same size, alignment, and ABI as T. + // MaybeUninit is guaranteed to have the same size, alignment, + // and ABI as T. // // This means as long as all of the MaybeUninits are initialized // then it is safe to transmute a MaybeUninit to T, and therefore // also [MaybeUninit; N] to [T; N]. We know that all of the - // elements are initialized because in the loop above the number of - // initialized elements are computed and then there is a guard that - // compares that to the total length of the array. + // elements are initialized because in the function call above the + // number of initialized elements are computed and then there is a + // guard that compares that to the total length of the array. // // See for more information: // https://doc.rust-lang.org/core/mem/union.MaybeUninit.html#initializing-an-array-element-by-element - unsafe { mem::transmute(arr) } + unsafe { $crate::core::mem::transmute(arr) } }; &ARR }}; } + +#[doc(hidden)] +pub const fn concat( + zero: MaybeUninit, + slices: &[&[T]], +) -> [MaybeUninit; LEN] { + let mut arr: [MaybeUninit; LEN] = [zero; LEN]; + let mut base = 0; + let mut i = 0; + while i < slices.len() { + let slice = slices[i]; + let mut j = 0; + while j < slice.len() { + // Ideally this should use `MaybeUninit::write` but we want to + // support older versions of Rust and that was only stabilized in + // Rust 1.85. + arr[base + j] = MaybeUninit::new(slice[j]); + j += 1; + } + base += slice.len(); + i += 1; + } + if base != LEN { + panic!("invalid length"); + } + arr +}