~alinuxninja/nginx-edge/trunk

« back to all changes in this revision

Viewing changes to debian/modules/ngx_pagespeed/psol/include/third_party/protobuf/src/google/protobuf/stubs/stl_util.h

  • Committer: Vivian
  • Date: 2015-12-04 18:20:11 UTC
  • Revision ID: git-v1:a36f2bc32e884f7473b3a47040e5411306144d7d
* Do not extract psol.tar.gz

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Protocol Buffers - Google's data interchange format
2
 
// Copyright 2008 Google Inc.  All rights reserved.
3
 
// http://code.google.com/p/protobuf/
4
 
//
5
 
// Redistribution and use in source and binary forms, with or without
6
 
// modification, are permitted provided that the following conditions are
7
 
// met:
8
 
//
9
 
//     * Redistributions of source code must retain the above copyright
10
 
// notice, this list of conditions and the following disclaimer.
11
 
//     * Redistributions in binary form must reproduce the above
12
 
// copyright notice, this list of conditions and the following disclaimer
13
 
// in the documentation and/or other materials provided with the
14
 
// distribution.
15
 
//     * Neither the name of Google Inc. nor the names of its
16
 
// contributors may be used to endorse or promote products derived from
17
 
// this software without specific prior written permission.
18
 
//
19
 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
 
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
 
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
 
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
 
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
 
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
 
 
31
 
// from google3/util/gtl/stl_util.h
32
 
 
33
 
#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__
34
 
#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__
35
 
 
36
 
#include <google/protobuf/stubs/common.h>
37
 
 
38
 
namespace google {
39
 
namespace protobuf {
40
 
 
41
 
// STLDeleteContainerPointers()
42
 
//  For a range within a container of pointers, calls delete
43
 
//  (non-array version) on these pointers.
44
 
// NOTE: for these three functions, we could just implement a DeleteObject
45
 
// functor and then call for_each() on the range and functor, but this
46
 
// requires us to pull in all of algorithm.h, which seems expensive.
47
 
// For hash_[multi]set, it is important that this deletes behind the iterator
48
 
// because the hash_set may call the hash function on the iterator when it is
49
 
// advanced, which could result in the hash function trying to deference a
50
 
// stale pointer.
51
 
template <class ForwardIterator>
52
 
void STLDeleteContainerPointers(ForwardIterator begin,
53
 
                                ForwardIterator end) {
54
 
  while (begin != end) {
55
 
    ForwardIterator temp = begin;
56
 
    ++begin;
57
 
    delete *temp;
58
 
  }
59
 
}
60
 
 
61
 
// Inside Google, this function implements a horrible, disgusting hack in which
62
 
// we reach into the string's private implementation and resize it without
63
 
// initializing the new bytes.  In some cases doing this can significantly
64
 
// improve performance.  However, since it's totally non-portable it has no
65
 
// place in open source code.  Feel free to fill this function in with your
66
 
// own disgusting hack if you want the perf boost.
67
 
inline void STLStringResizeUninitialized(string* s, size_t new_size) {
68
 
  s->resize(new_size);
69
 
}
70
 
 
71
 
// Return a mutable char* pointing to a string's internal buffer,
72
 
// which may not be null-terminated. Writing through this pointer will
73
 
// modify the string.
74
 
//
75
 
// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the
76
 
// next call to a string method that invalidates iterators.
77
 
//
78
 
// As of 2006-04, there is no standard-blessed way of getting a
79
 
// mutable reference to a string's internal buffer. However, issue 530
80
 
// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530)
81
 
// proposes this as the method. According to Matt Austern, this should
82
 
// already work on all current implementations.
83
 
inline char* string_as_array(string* str) {
84
 
  // DO NOT USE const_cast<char*>(str->data())! See the unittest for why.
85
 
  return str->empty() ? NULL : &*str->begin();
86
 
}
87
 
 
88
 
// STLDeleteElements() deletes all the elements in an STL container and clears
89
 
// the container.  This function is suitable for use with a vector, set,
90
 
// hash_set, or any other STL container which defines sensible begin(), end(),
91
 
// and clear() methods.
92
 
//
93
 
// If container is NULL, this function is a no-op.
94
 
//
95
 
// As an alternative to calling STLDeleteElements() directly, consider
96
 
// ElementDeleter (defined below), which ensures that your container's elements
97
 
// are deleted when the ElementDeleter goes out of scope.
98
 
template <class T>
99
 
void STLDeleteElements(T *container) {
100
 
  if (!container) return;
101
 
  STLDeleteContainerPointers(container->begin(), container->end());
102
 
  container->clear();
103
 
}
104
 
 
105
 
// Given an STL container consisting of (key, value) pairs, STLDeleteValues
106
 
// deletes all the "value" components and clears the container.  Does nothing
107
 
// in the case it's given a NULL pointer.
108
 
 
109
 
template <class T>
110
 
void STLDeleteValues(T *v) {
111
 
  if (!v) return;
112
 
  for (typename T::iterator i = v->begin(); i != v->end(); ++i) {
113
 
    delete i->second;
114
 
  }
115
 
  v->clear();
116
 
}
117
 
 
118
 
}  // namespace protobuf
119
 
}  // namespace google
120
 
 
121
 
#endif  // GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__