diff --git a/include/ceres/internal/memory.h b/include/ceres/internal/memory.h
deleted file mode 100644
index e54cf2b..0000000
--- a/include/ceres/internal/memory.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Abseil Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      https://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// -----------------------------------------------------------------------------
-// File: memory.h
-// -----------------------------------------------------------------------------
-//
-// This header file contains utility functions for managing the creation and
-// conversion of smart pointers. This file is an extension to the C++
-// standard <memory> library header file.
-
-#ifndef CERES_PUBLIC_INTERNAL_MEMORY_H_
-#define CERES_PUBLIC_INTERNAL_MEMORY_H_
-
-#include <memory>
-
-#ifdef CERES_HAVE_EXCEPTIONS
-#define CERES_INTERNAL_TRY try
-#define CERES_INTERNAL_CATCH_ANY catch (...)
-#define CERES_INTERNAL_RETHROW \
-  do {                         \
-    throw;                     \
-  } while (false)
-#else  // CERES_HAVE_EXCEPTIONS
-#define CERES_INTERNAL_TRY if (true)
-#define CERES_INTERNAL_CATCH_ANY else if (false)
-#define CERES_INTERNAL_RETHROW \
-  do {                         \
-  } while (false)
-#endif  // CERES_HAVE_EXCEPTIONS
-
-namespace ceres::internal {
-
-template <typename Allocator, typename Iterator, typename... Args>
-void ConstructRange(Allocator& alloc,
-                    Iterator first,
-                    Iterator last,
-                    const Args&... args) {
-  for (Iterator cur = first; cur != last; ++cur) {
-    CERES_INTERNAL_TRY {
-      std::allocator_traits<Allocator>::construct(
-          alloc, std::addressof(*cur), args...);
-    }
-    CERES_INTERNAL_CATCH_ANY {
-      while (cur != first) {
-        --cur;
-        std::allocator_traits<Allocator>::destroy(alloc, std::addressof(*cur));
-      }
-      CERES_INTERNAL_RETHROW;
-    }
-  }
-}
-
-template <typename Allocator, typename Iterator, typename InputIterator>
-void CopyRange(Allocator& alloc,
-               Iterator destination,
-               InputIterator first,
-               InputIterator last) {
-  for (Iterator cur = destination; first != last;
-       static_cast<void>(++cur), static_cast<void>(++first)) {
-    CERES_INTERNAL_TRY {
-      std::allocator_traits<Allocator>::construct(
-          alloc, std::addressof(*cur), *first);
-    }
-    CERES_INTERNAL_CATCH_ANY {
-      while (cur != destination) {
-        --cur;
-        std::allocator_traits<Allocator>::destroy(alloc, std::addressof(*cur));
-      }
-      CERES_INTERNAL_RETHROW;
-    }
-  }
-}
-
-}  // namespace ceres::internal
-
-#endif  // CERES_PUBLIC_INTERNAL_MEMORY_H_
