stl_util.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Ceres Solver - A fast non-linear least squares minimizer
  2. // Copyright 2023 Google Inc. All rights reserved.
  3. // http://ceres-solver.org/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are met:
  7. //
  8. // * Redistributions of source code must retain the above copyright notice,
  9. // this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above copyright notice,
  11. // this list of conditions and the following disclaimer in the documentation
  12. // and/or other materials provided with the distribution.
  13. // * Neither the name of Google Inc. nor the names of its contributors may be
  14. // used to endorse or promote products derived from this software without
  15. // specific prior written permission.
  16. //
  17. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  21. // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22. // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23. // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25. // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27. // POSSIBILITY OF SUCH DAMAGE.
  28. //
  29. // Author: keir@google.com (Keir Mierle)
  30. #ifndef CERES_INTERNAL_STL_UTIL_H_
  31. #define CERES_INTERNAL_STL_UTIL_H_
  32. #include <algorithm>
  33. namespace ceres {
  34. // STLDeleteContainerPointers()
  35. // For a range within a container of pointers, calls delete
  36. // (non-array version) on these pointers.
  37. // NOTE: for these three functions, we could just implement a DeleteObject
  38. // functor and then call for_each() on the range and functor, but this
  39. // requires us to pull in all of algorithm.h, which seems expensive.
  40. // For hash_[multi]set, it is important that this deletes behind the iterator
  41. // because the hash_set may call the hash function on the iterator when it is
  42. // advanced, which could result in the hash function trying to deference a
  43. // stale pointer.
  44. template <class ForwardIterator>
  45. void STLDeleteContainerPointers(ForwardIterator begin, ForwardIterator end) {
  46. while (begin != end) {
  47. ForwardIterator temp = begin;
  48. ++begin;
  49. delete *temp;
  50. }
  51. }
  52. // Variant of STLDeleteContainerPointers which allows the container to
  53. // contain duplicates.
  54. template <class ForwardIterator>
  55. void STLDeleteUniqueContainerPointers(ForwardIterator begin,
  56. ForwardIterator end) {
  57. sort(begin, end);
  58. ForwardIterator new_end = unique(begin, end);
  59. while (begin != new_end) {
  60. ForwardIterator temp = begin;
  61. ++begin;
  62. delete *temp;
  63. }
  64. }
  65. // STLDeleteElements() deletes all the elements in an STL container and clears
  66. // the container. This function is suitable for use with a vector, set,
  67. // hash_set, or any other STL container which defines sensible begin(), end(),
  68. // and clear() methods.
  69. //
  70. // If container is nullptr, this function is a no-op.
  71. //
  72. // As an alternative to calling STLDeleteElements() directly, consider
  73. // ElementDeleter (defined below), which ensures that your container's elements
  74. // are deleted when the ElementDeleter goes out of scope.
  75. template <class T>
  76. void STLDeleteElements(T* container) {
  77. if (!container) return;
  78. STLDeleteContainerPointers(container->begin(), container->end());
  79. container->clear();
  80. }
  81. } // namespace ceres
  82. #endif // CERES_INTERNAL_STL_UTIL_H_