16e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 26e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 36e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// The LLVM Compiler Infrastructure 46e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 56e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open 66e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// Source Licenses. See LICENSE.TXT for details. 76e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 86e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 96e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// UNSUPPORTED: c++98, c++03 116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// <experimental/filesystem> 136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// class path 156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// template <class ECharT, class Traits = char_traits<ECharT>, 176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// class Allocator = allocator<ECharT>> 186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// basic_string<ECharT, Traits, Allocator> 196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// string(const Allocator& a = Allocator()) const; 206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <experimental/filesystem> 226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <type_traits> 236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cassert> 246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_macros.h" 266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_iterators.h" 276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "count_new.hpp" 286e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "min_allocator.h" 296e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "filesystem_test_helper.hpp" 306e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 316e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace fs = std::experimental::filesystem; 326e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 33880e38b206ee452f777922dfa61a959cee0067cbEric Fiselier// the SSO is always triggered for strings of size 2. 34880e38b206ee452f777922dfa61a959cee0067cbEric FiselierMultiStringType shortString = MKSTR("a"); 356e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierMultiStringType longString = MKSTR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/123456789/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); 366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class CharT> 386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliervoid doShortStringTest(MultiStringType const& MS) { 396e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using namespace fs; 406e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Ptr = CharT const*; 416e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Str = std::basic_string<CharT>; 426e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Alloc = std::allocator<CharT>; 436e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Ptr value = MS; 446e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path p((const char*)MS); 456e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { 46591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier DisableAllocationGuard g; 476e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Str s = p.string<CharT>(); 486e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s == value); 496e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Str s2 = p.string<CharT>(Alloc{}); 506e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s2 == value); 516e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 52591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier using MAlloc = malloc_allocator<CharT>; 53591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier MAlloc::reset(); 54591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier { 55591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier using Traits = std::char_traits<CharT>; 56591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier using AStr = std::basic_string<CharT, Traits, MAlloc>; 57880e38b206ee452f777922dfa61a959cee0067cbEric Fiselier DisableAllocationGuard g; 58591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier AStr s = p.string<CharT, Traits, MAlloc>(); 59591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(s == value); 60591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(MAlloc::alloc_count == 0); 61591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(MAlloc::outstanding_alloc() == 0); 62591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier } 63591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier MAlloc::reset(); 64591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier { // Other allocator - provided copy 65591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier using Traits = std::char_traits<CharT>; 66591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier using AStr = std::basic_string<CharT, Traits, MAlloc>; 67880e38b206ee452f777922dfa61a959cee0067cbEric Fiselier DisableAllocationGuard g; 68591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier MAlloc a; 69591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier // don't allow another allocator to be default constructed. 70591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier MAlloc::disable_default_constructor = true; 71591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier AStr s = p.string<CharT, Traits, MAlloc>(a); 72591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(s == value); 73591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(MAlloc::alloc_count == 0); 74591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier assert(MAlloc::outstanding_alloc() == 0); 75591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier } 76591e18f6aaa7f8a8ae1ed0e239708b5e752173bdEric Fiselier MAlloc::reset(); 776e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 786e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 796e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliertemplate <class CharT> 806e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliervoid doLongStringTest(MultiStringType const& MS) { 816e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using namespace fs; 826e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Ptr = CharT const*; 836e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Str = std::basic_string<CharT>; 846e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Ptr value = MS; 856e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path p((const char*)MS); 866e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { // Default allocator 876e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Alloc = std::allocator<CharT>; 886e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Str s = p.string<CharT>(); 896e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s == value); 906e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier Str s2 = p.string<CharT>(Alloc{}); 916e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s2 == value); 926e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 936e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using MAlloc = malloc_allocator<CharT>; 946e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier MAlloc::reset(); 956e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { // Other allocator - default construct 966e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Traits = std::char_traits<CharT>; 976e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using AStr = std::basic_string<CharT, Traits, MAlloc>; 98880e38b206ee452f777922dfa61a959cee0067cbEric Fiselier DisableAllocationGuard g; 996e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier AStr s = p.string<CharT, Traits, MAlloc>(); 1006e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s == value); 1016e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(MAlloc::alloc_count > 0); 1026e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(MAlloc::outstanding_alloc() == 1); 1036e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1046e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier MAlloc::reset(); 1056e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { // Other allocator - provided copy 1066e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using Traits = std::char_traits<CharT>; 1076e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using AStr = std::basic_string<CharT, Traits, MAlloc>; 108880e38b206ee452f777922dfa61a959cee0067cbEric Fiselier DisableAllocationGuard g; 1096e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier MAlloc a; 1106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // don't allow another allocator to be default constructed. 1116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier MAlloc::disable_default_constructor = true; 1126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier AStr s = p.string<CharT, Traits, MAlloc>(a); 1136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(s == value); 1146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(MAlloc::alloc_count > 0); 1156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(MAlloc::outstanding_alloc() == 1); 1166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier MAlloc::reset(); 1186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ///////////////////////////////////////////////////////////////////////////// 1196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 1206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierint main() 1226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 1236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier using namespace fs; 1246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { 1256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier auto const& S = shortString; 1266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doShortStringTest<char>(S); 1276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doShortStringTest<wchar_t>(S); 1286e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doShortStringTest<char16_t>(S); 1296e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doShortStringTest<char32_t>(S); 1306e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1316e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { 1326e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier auto const& S = longString; 1336e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doLongStringTest<char>(S); 1346e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doLongStringTest<wchar_t>(S); 1356e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doLongStringTest<char16_t>(S); 1366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier doLongStringTest<char32_t>(S); 1376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 139