#include "ceres/internal/export.h"
#include "ceres/local_parameterization.h"
#include "ceres/manifold.h"
#include "glog/logging.h"

namespace ceres {
namespace internal {

// Adapter to wrap LocalParameterization and make them look like Manifolds.
//
// ManifoldAdapter NEVER takes ownership of local_parameterization.
class CERES_NO_EXPORT ManifoldAdapter : public Manifold {
 public:
  ManifoldAdapter(const LocalParameterization* local_parameterization)
      : local_parameterization_(local_parameterization) {
    CHECK(local_parameterization != nullptr);
  }


  bool Plus(const double* x,
            const double* delta,
            double* x_plus_delta) const override {
    return local_parameterization_->Plus(x, delta, x_plus_delta);
  }

  bool PlusJacobian(const double* x, double* jacobian) const override {
    return local_parameterization_->ComputeJacobian(x, jacobian);
  }

  bool RightMultiplyByPlusJacobian(const double* x,
                                   const int num_rows,
                                   const double* ambient_matrix,
                                   double* tangent_matrix) const override {
    return local_parameterization_->MultiplyByJacobian(
        x, num_rows, ambient_matrix, tangent_matrix);
  }

  bool Minus(const double* y, const double* x, double* delta) const override {
    LOG(FATAL) << "This should never be called.";
    return false;
  }

  bool MinusJacobian(const double* x, double* jacobian) const override {
    LOG(FATAL) << "This should never be called.";
    return false;
  }

  int AmbientSize() const override {
    return local_parameterization_->GlobalSize();
  }

  int TangentSize() const override {
    return local_parameterization_->LocalSize();
  }

 private:
  const LocalParameterization* local_parameterization_;
};

}  // namespace internal
}  // namespace ceres
