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// <functional>
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert// template <class T>
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert// struct hash
147112dae6acac544a0271a85d95342c583441e2d1Dan Albert//     : public unary_function<T, size_t>
157112dae6acac544a0271a85d95342c583441e2d1Dan Albert// {
167112dae6acac544a0271a85d95342c583441e2d1Dan Albert//     size_t operator()(T val) const;
177112dae6acac544a0271a85d95342c583441e2d1Dan Albert// };
187112dae6acac544a0271a85d95342c583441e2d1Dan Albert
197112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Not very portable
207112dae6acac544a0271a85d95342c583441e2d1Dan Albert
217112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <experimental/string_view>
227112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <cassert>
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <type_traits>
247112dae6acac544a0271a85d95342c583441e2d1Dan Albert
257112dae6acac544a0271a85d95342c583441e2d1Dan Albertusing std::experimental::string_view;
267112dae6acac544a0271a85d95342c583441e2d1Dan Albert
277112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate <class T>
287112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid
297112dae6acac544a0271a85d95342c583441e2d1Dan Alberttest()
307112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
317112dae6acac544a0271a85d95342c583441e2d1Dan Albert    typedef std::hash<T> H;
324dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert    static_assert((std::is_same<typename H::argument_type, T>::value), "" );
334dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert    static_assert((std::is_same<typename H::result_type, std::size_t>::value), "" );
347112dae6acac544a0271a85d95342c583441e2d1Dan Albert    H h;
357112dae6acac544a0271a85d95342c583441e2d1Dan Albert//     std::string g1 = "1234567890";
367112dae6acac544a0271a85d95342c583441e2d1Dan Albert//     std::string g2 = "1234567891";
377112dae6acac544a0271a85d95342c583441e2d1Dan Albert    typedef typename T::value_type char_type;
387112dae6acac544a0271a85d95342c583441e2d1Dan Albert    char_type g1 [ 10 ];
397112dae6acac544a0271a85d95342c583441e2d1Dan Albert    char_type g2 [ 10 ];
407112dae6acac544a0271a85d95342c583441e2d1Dan Albert    for ( int i = 0; i < 10; ++i )
417112dae6acac544a0271a85d95342c583441e2d1Dan Albert        g1[i] = g2[9-i] = '0' + i;
427112dae6acac544a0271a85d95342c583441e2d1Dan Albert    T s1(g1, 10);
437112dae6acac544a0271a85d95342c583441e2d1Dan Albert    T s2(g2, 10);
447112dae6acac544a0271a85d95342c583441e2d1Dan Albert    assert(h(s1) != h(s2));
457112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
467112dae6acac544a0271a85d95342c583441e2d1Dan Albert
477112dae6acac544a0271a85d95342c583441e2d1Dan Albertint main()
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
497112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<std::experimental::string_view>();
507112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
517112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<std::experimental::u16string_view>();
527112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<std::experimental::u32string_view>();
537112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
547112dae6acac544a0271a85d95342c583441e2d1Dan Albert    test<std::experimental::wstring_view>();
557112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
56