/*!
 * Copyright (c) 2019 by Contributors
 * \file model.h
 * \brief Defines the abstract interface for different components in XGBoost.
 */
#ifndef XGBOOST_MODEL_H_
#define XGBOOST_MODEL_H_

namespace dmlc {
class Stream;
}  // namespace dmlc

namespace xgboost {

class Json;

struct Model {
  virtual ~Model() = default;
  /*!
   * \brief load the model from a JSON object
   * \param in JSON object where to load the model from
   */
  virtual void LoadModel(Json const& in) = 0;
  /*!
   * \brief saves the model config to a JSON object
   * \param out JSON container where to save the model to
   */
  virtual void SaveModel(Json* out) const = 0;
};

struct Configurable {
  virtual ~Configurable() = default;
  /*!
   * \brief Load configuration from JSON object
   * \param in JSON object containing the configuration
   */
  virtual void LoadConfig(Json const& in) = 0;
  /*!
   * \brief Save configuration to JSON object
   * \param out pointer to output JSON object
   */
  virtual void SaveConfig(Json* out) const = 0;
};
}  // namespace xgboost

#endif  // XGBOOST_MODEL_H_
