text: #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
  