1// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// In most .h files, we would rather include a declaration of an stl 6// rather than including the appropriate stl h file (which brings in 7// lots of noise). For many STL classes this is ok (eg pair), but for 8// some it's really annoying. We define those here, so you can 9// just include this file instead of having to deal with the annoyance. 10// 11// Most of the annoyance, btw, has to do with the default allocator. 12 13#ifndef _STL_DECL_MSVC_H 14#define _STL_DECL_MSVC_H 15 16// VC++ namespace / STL issues; make them explicit 17#include <wchar.h> 18#include <string> 19#include <vector> 20#include <functional> 21#include <utility> 22#include <set> 23#include <list> 24#define slist list 25#include <algorithm> 26#include <deque> 27#include <iostream> 28#include <map> 29#include <queue> 30#include <stack> 31 32// copy_n isn't to be found anywhere in MSVC's STL 33template <typename InputIterator, typename Size, typename OutputIterator> 34std::pair<InputIterator, OutputIterator> 35copy_n(InputIterator in, Size count, OutputIterator out) { 36 for ( ; count > 0; --count) { 37 *out = *in; 38 ++out; 39 ++in; 40 } 41 return std::make_pair(in, out); 42} 43 44// Nor are the following selectors 45template <typename T> 46struct identity { 47 inline const T& operator()(const T& t) const { return t; } 48}; 49 50// Copied from STLport 51template <class _Pair> 52struct select1st : public std::unary_function<_Pair, typename _Pair::first_type> { 53 const typename _Pair::first_type& operator()(const _Pair& __x) const { 54 return __x.first; 55 } 56}; 57 58template <class _Pair> 59struct select2nd : public std::unary_function<_Pair, typename _Pair::second_type> 60{ 61 const typename _Pair::second_type& operator()(const _Pair& __x) const { 62 return __x.second; 63 } 64}; 65 66 67#if _MSC_VER >= 1300 68 69// If you compile on Windows and get a compile-time error because 70// some google3 code specifies a 3rd or 4th parameter to one of 71// these template classes, then you have to put in some #ifdefs 72// and use the NATIVE_HASH_NAMESPACE::hash_(set|map) implementation. 73namespace msvchash { 74 template <typename Key> 75 struct hash; 76 77 template <class Key, 78 class HashFcn = hash<Key> > 79 class hash_set; 80 81 template <class Key, class Val, 82 class HashFcn = hash<Key> > 83 class hash_map; 84 85 template <class Key, 86 class HashFcn = hash<Key> > 87 class hash_multiset; 88 89 template <class Key, class Val, 90 class HashFcn = hash<Key> > 91 class hash_multimap; 92} // end namespace msvchash 93 94using msvchash::hash_set; 95using msvchash::hash_map; 96using msvchash::hash; 97using msvchash::hash_multimap; 98using msvchash::hash_multiset; 99 100#else 101#define hash_map map 102#define hash_set set 103#endif 104 105using namespace std; 106 107#endif /* #ifdef _STL_DECL_MSVC_H */ 108