17112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
27112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
37112dae6acac544a0271a85d95342c583441e2d1Dan Albert//                     The LLVM Compiler Infrastructure
47112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
57112dae6acac544a0271a85d95342c583441e2d1Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
67112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Source Licenses. See LICENSE.TXT for details.
77112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
87112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert// <string_view>
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert// size_type copy(charT* s, size_type n, size_type pos = 0) const;
147112dae6acac544a0271a85d95342c583441e2d1Dan Albert
157112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Throws: out_of_range if pos > size().
167112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Remarks: Let rlen be the smaller of n and size() - pos.
177112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Requires: [s, s+rlen) is a valid range.
187112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Effects: Equivalent to std::copy_n(begin() + pos, rlen, s).
197112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Returns: rlen.
207112dae6acac544a0271a85d95342c583441e2d1Dan Albert
217112dae6acac544a0271a85d95342c583441e2d1Dan Albert
227112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <experimental/string_view>
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <cassert>
247112dae6acac544a0271a85d95342c583441e2d1Dan Albert
257112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate<typename CharT>
267112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid test1 ( std::experimental::basic_string_view<CharT> sv, size_t n, size_t pos ) {
277112dae6acac544a0271a85d95342c583441e2d1Dan Albert    const size_t rlen = std::min ( n, sv.size() - pos );
287112dae6acac544a0271a85d95342c583441e2d1Dan Albert
297112dae6acac544a0271a85d95342c583441e2d1Dan Albert    CharT *dest1 = new CharT [rlen + 1];    dest1[rlen] = 0;
307112dae6acac544a0271a85d95342c583441e2d1Dan Albert    CharT *dest2 = new CharT [rlen + 1];    dest2[rlen] = 0;
317112dae6acac544a0271a85d95342c583441e2d1Dan Albert
327112dae6acac544a0271a85d95342c583441e2d1Dan Albert    try {
337112dae6acac544a0271a85d95342c583441e2d1Dan Albert        sv.copy(dest1, n, pos);
347112dae6acac544a0271a85d95342c583441e2d1Dan Albert        std::copy_n(sv.begin() + pos, rlen, dest2);
357112dae6acac544a0271a85d95342c583441e2d1Dan Albert
367112dae6acac544a0271a85d95342c583441e2d1Dan Albert        for ( size_t i = 0; i <= rlen; ++i )
377112dae6acac544a0271a85d95342c583441e2d1Dan Albert            assert ( dest1[i] == dest2[i] );
387112dae6acac544a0271a85d95342c583441e2d1Dan Albert        }
397112dae6acac544a0271a85d95342c583441e2d1Dan Albert    catch ( const std::out_of_range & ) { assert ( pos > sv.size()); }
407112dae6acac544a0271a85d95342c583441e2d1Dan Albert    delete [] dest1;
417112dae6acac544a0271a85d95342c583441e2d1Dan Albert    delete [] dest2;
427112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
437112dae6acac544a0271a85d95342c583441e2d1Dan Albert
447112dae6acac544a0271a85d95342c583441e2d1Dan Albert
457112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate<typename CharT>
467112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid test ( const CharT *s ) {
477112dae6acac544a0271a85d95342c583441e2d1Dan Albert    typedef std::experimental::basic_string_view<CharT> string_view_t;
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert
497112dae6acac544a0271a85d95342c583441e2d1Dan Albert    string_view_t sv1 ( s );
507112dae6acac544a0271a85d95342c583441e2d1Dan Albert
517112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1,  0, 0);
527112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1,  1, 0);
537112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, 20, 0);
547112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, sv1.size(), 0);
557112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, 20, string_view_t::npos);
567112dae6acac544a0271a85d95342c583441e2d1Dan Albert
577112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1,   0, 3);
587112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1,   2, 3);
597112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, 100, 3);
607112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, 100, string_view_t::npos);
617112dae6acac544a0271a85d95342c583441e2d1Dan Albert
627112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, sv1.size(), string_view_t::npos);
637112dae6acac544a0271a85d95342c583441e2d1Dan Albert
647112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, sv1.size() + 1, 0);
657112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, sv1.size() + 1, 1);
667112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test1(sv1, sv1.size() + 1, string_view_t::npos);
677112dae6acac544a0271a85d95342c583441e2d1Dan Albert
687112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
697112dae6acac544a0271a85d95342c583441e2d1Dan Albert
707112dae6acac544a0271a85d95342c583441e2d1Dan Albertint main () {
717112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
727112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( "ABCDE");
737112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( "a" );
747112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( "" );
757112dae6acac544a0271a85d95342c583441e2d1Dan Albert
767112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
777112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( L"ABCDE" );
787112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( L"a" );
797112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( L"" );
807112dae6acac544a0271a85d95342c583441e2d1Dan Albert
817112dae6acac544a0271a85d95342c583441e2d1Dan Albert#if __cplusplus >= 201103L
827112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
837112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( u"ABCDE" );
847112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( u"a" );
857112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( u"" );
867112dae6acac544a0271a85d95342c583441e2d1Dan Albert
877112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
887112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( U"ABCDE" );
897112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( U"a" );
907112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test ( U"" );
917112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif
927112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
93