/**
 * Copyright 2021 Huawei Technologies Co., Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MINDSPORE_LITE_INCLUDE_REGISTRY_NODE_PARSER_H_
#define MINDSPORE_LITE_INCLUDE_REGISTRY_NODE_PARSER_H_

#include <map>
#include <memory>
#include <string>
#include <vector>
#include "include/registry/converter_context.h"

namespace onnx {
class GraphProto;
class NodeProto;
}  // namespace onnx

namespace caffe {
class LayerParameter;
}  // namespace caffe

namespace tensorflow {
class NodeDef;
}  // namespace tensorflow

namespace tflite {
struct OperatorT;
struct SubGraphT;
struct ModelT;
}  // namespace tflite

namespace mindspore {
namespace ops {
/// \brief PrimitiveC defined a base class for storing properties
class PrimitiveC;
}  // namespace ops
namespace converter {
/// \brief NodeParser defined a base class for parsing node's attributes.
class MS_API NodeParser {
 public:
  /// \brief Constructor.
  NodeParser() = default;

  /// \brief Destructor.
  virtual ~NodeParser() = default;

  /// \brief Method to parse node of ONNX.
  ///
  /// \param[in] onnx_graph Define the onnx graph, which contains all information about the graph.
  /// \param[in] onnx_node Define the node to be resolved.
  ///
  /// \return PrimitiveC Attribute storage.
  virtual ops::PrimitiveC *Parse(const onnx::GraphProto &onnx_graph, const onnx::NodeProto &onnx_node) {
    return nullptr;
  }

  /// \brief Method to parse node of CAFFE.
  ///
  /// \param[in] proto Define the node which contains attributes.
  /// \param[in] weight Define the node which contains weight information.
  ///
  /// \return PrimitiveC Attribute storage.
  virtual ops::PrimitiveC *Parse(const caffe::LayerParameter &proto, const caffe::LayerParameter &weight) {
    return nullptr;
  }

  /// \brief Method to parse node of TF.
  ///
  /// \param[in] tf_op Define the node to be resolved.
  /// \param[in] tf_node_map Define the all nodes of the graph.
  /// \param[in] inputs Define the input name, that determines which inputs will be parsed including their order.
  ///            Determined by user.
  /// \param[in] output_size Define the output num of current node, which need to be determined by user.
  ///
  /// \return PrimitiveC Attribute storage.
  virtual ops::PrimitiveC *Parse(const tensorflow::NodeDef &tf_op,
                                 const std::map<std::string, const tensorflow::NodeDef *> &tf_node_map,
                                 std::vector<std::string> *inputs, int *output_size) {
    return nullptr;
  }

  /// \brief Method to parse node of TFLITE
  ///
  /// \param[in] tflite_op Define the node to be resolved.
  /// \param[in] tflite_model Define the model, which contains all information abort the graph.
  ///
  /// \return PrimitiveC Attribute storage.
  virtual ops::PrimitiveC *Parse(const std::unique_ptr<tflite::OperatorT> &tflite_op,
                                 const std::unique_ptr<tflite::SubGraphT> &tflite_subgraph,
                                 const std::unique_ptr<tflite::ModelT> &tflite_model) {
    return nullptr;
  }
};
/// \brief NodeParserPtr defined a shared_ptr type.
using NodeParserPtr = std::shared_ptr<NodeParser>;
}  // namespace converter
}  // namespace mindspore

#endif  // MINDSPORE_LITE_INCLUDE_REGISTRY_NODE_PARSER_H_