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