// Ceres Solver - A fast non-linear least squares minimizer
// Copyright 2014 Google Inc. All rights reserved.
// http://code.google.com/p/ceres-solver/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
// * Neither the name of Google Inc. nor the names of its contributors may be
//   used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: alexs.mac@gmail.com (Alex Stewart)

// Configuration options for Ceres.
//
// Do not edit this file, it was automatically configured by CMake when
// Ceres was compiled with the relevant configuration for the machine
// on which Ceres was compiled.
//
// Ceres Developers: All options should have the same name as their mapped
//                   CMake options, in the preconfigured version of this file
//                   all options should be enclosed in '@'.

#ifndef CERES_PUBLIC_INTERNAL_CONFIG_H_
#define CERES_PUBLIC_INTERNAL_CONFIG_H_

// If defined, use the LGPL code in Eigen.
@CERES_USE_EIGEN_SPARSE@

// If defined, Ceres was compiled without LAPACK.
@CERES_NO_LAPACK@

// If defined, Ceres was compiled without SuiteSparse.
@CERES_NO_SUITESPARSE@

// If defined, Ceres was compiled without CXSparse.
@CERES_NO_CXSPARSE@

// If defined, Ceres was compiled without Schur specializations.
@CERES_RESTRICT_SCHUR_SPECIALIZATION@

// If defined, Ceres was compiled to use Eigen instead of hardcoded BLAS
// routines.
@CERES_NO_CUSTOM_BLAS@

// If defined, Ceres was compiled without multithreading support.
@CERES_NO_THREADS@
// If defined Ceres was compiled with OpenMP multithreading support.
@CERES_USE_OPENMP@
// Additionally defined on *nix if Ceres was compiled with OpenMP support,
// as in this case pthreads is also required.
@CERES_HAVE_PTHREAD@
@CERES_HAVE_RWLOCK@

// Which version of unordered map was used when Ceres was compiled. Exactly
// one of these will be defined for any given build.
@CERES_STD_UNORDERED_MAP@
@CERES_STD_UNORDERED_MAP_IN_TR1_NAMESPACE@
@CERES_TR1_UNORDERED_MAP@
@CERES_NO_UNORDERED_MAP@

// If defined, the memory header is in <tr1/memory>, otherwise <memory>.
@CERES_TR1_MEMORY_HEADER@

// If defined shared_ptr is in std::tr1 namespace, otherwise std.
@CERES_TR1_SHARED_PTR@

// If defined, Ceres was built as a shared library.
@CERES_USING_SHARED_LIBRARY@

#endif  // CERES_PUBLIC_INTERNAL_CONFIG_H_
