#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 ManifoldAdapter : public Manifold {
 public:
  ManifoldAdapter(const LocalParameterization* local_parameterization)
      : local_parameterization_(local_parameterization) {
    CHECK(local_parameterization != nullptr);
  }

  virtual ~ManifoldAdapter() {}

  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
