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