15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In most .h files, we would rather include a declaration of an stl
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rather than including the appropriate stl h file (which brings in
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lots of noise).  For many STL classes this is ok (eg pair), but for
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// some it's really annoying.  We define those here, so you can
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just include this file instead of having to deal with the annoyance.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Most of the annoyance, btw, has to do with the default allocator.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _STL_DECL_MSVC_H
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _STL_DECL_MSVC_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VC++ namespace / STL issues; make them explicit
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <wchar.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <functional>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define slist list
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iostream>
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stack>
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copy_n isn't to be found anywhere in MSVC's STL
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename InputIterator, typename Size, typename OutputIterator>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::pair<InputIterator, OutputIterator>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)copy_n(InputIterator in, Size count, OutputIterator out) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for ( ; count > 0; --count) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out = *in;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++out;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++in;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::make_pair(in, out);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Nor are the following selectors
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T>
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct identity {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline const T& operator()(const T& t) const { return t; }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copied from STLport
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class _Pair>
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct select1st : public std::unary_function<_Pair, typename _Pair::first_type> {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const typename _Pair::first_type& operator()(const _Pair& __x) const {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return __x.first;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class _Pair>
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct select2nd : public std::unary_function<_Pair, typename _Pair::second_type>
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const typename _Pair::second_type& operator()(const _Pair& __x) const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return __x.second;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if _MSC_VER >= 1300
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If you compile on Windows and get a compile-time error because
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// some google3 code specifies a 3rd or 4th parameter to one of
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// these template classes, then you have to put in some #ifdefs
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and use the NATIVE_HASH_NAMESPACE::hash_(set|map) implementation.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace msvchash {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename Key>
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct hash;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Key,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            class HashFcn = hash<Key> >
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class hash_set;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Key, class Val,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            class HashFcn = hash<Key> >
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class hash_map;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Key,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            class HashFcn = hash<Key> >
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class hash_multiset;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class Key, class Val,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            class HashFcn = hash<Key> >
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class hash_multimap;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace  msvchash
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using msvchash::hash_set;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using msvchash::hash_map;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using msvchash::hash;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using msvchash::hash_multimap;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using msvchash::hash_multiset;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define hash_map map
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define hash_set set
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace std;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif   /* #ifdef _STL_DECL_MSVC_H */
108