// TR1 functional header -*- C++ -*- // Copyright (C) 2004, 2005 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 2, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING. If not, write to the Free // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, // USA. // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. /** @file * This is a TR1 C++ Library header. */ #ifndef _TR1_FUNCTIONAL #define _TR1_FUNCTIONAL 1 #include "../functional" #include // for std::tr1::hash namespace std { namespace tr1 { template class reference_wrapper { _Tp* _M_data; public: typedef _Tp type; explicit reference_wrapper(_Tp& __indata): _M_data(&__indata) { } reference_wrapper(const reference_wrapper<_Tp>& __inref): _M_data(__inref._M_data) { } reference_wrapper& operator=(const reference_wrapper<_Tp>& __inref) { _M_data = __inref._M_data; return *this; } operator _Tp&() const { return this->get(); } _Tp& get() const { return *_M_data; } }; // Denotes a reference should be taken to a variable. template reference_wrapper<_Tp> ref(_Tp& __t) { return reference_wrapper<_Tp>(__t); } // Denotes a const reference should be taken to a variable. template reference_wrapper cref(const _Tp& __t) { return reference_wrapper(__t); } template reference_wrapper<_Tp> ref(reference_wrapper<_Tp> __t) { return ref(__t.get()); } template reference_wrapper cref(reference_wrapper<_Tp> __t) { return cref(__t.get()); } // Definition of default hash function std::tr1::hash<>. The types for // which std::tr1::hash is defined is in clause 6.3.3. of the PDTR. template struct hash; #define tr1_hashtable_define_trivial_hash(T) \ template <> struct hash { \ std::size_t operator()(T val) const { return static_cast(val); } \ } \ tr1_hashtable_define_trivial_hash(bool); tr1_hashtable_define_trivial_hash(char); tr1_hashtable_define_trivial_hash(signed char); tr1_hashtable_define_trivial_hash(unsigned char); tr1_hashtable_define_trivial_hash(wchar_t); tr1_hashtable_define_trivial_hash(short); tr1_hashtable_define_trivial_hash(int); tr1_hashtable_define_trivial_hash(long); tr1_hashtable_define_trivial_hash(unsigned short); tr1_hashtable_define_trivial_hash(unsigned int); tr1_hashtable_define_trivial_hash(unsigned long); tr1_hashtable_define_trivial_hash(float); tr1_hashtable_define_trivial_hash(double); tr1_hashtable_define_trivial_hash(long double); #undef tr1_hashtable_define_trivial_hash template struct hash { std::size_t operator()(T* p) const { return reinterpret_cast(p); } }; // ??? We can probably find a better hash function than this (i.e. one // that vectorizes better and that produces a more uniform distribution). // XXX String hash probably shouldn't be an inline member function, // since it's nontrivial. Once we have the framework for TR1 .cc // files, this should go in one. template <> struct hash { std::size_t operator()(const std::string& s) const { std::size_t result = 0; for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) result = (result * 131) + *i; return result; } }; #ifdef _GLIBCXX_USE_WCHAR_T template <> struct hash { std::size_t operator()(const std::wstring& s) const { std::size_t result = 0; for (std::wstring::const_iterator i = s.begin(); i != s.end(); ++i) result = (result * 131) + *i; return result; } }; #endif } } #endif