//
// Copyright © 2017 Arm Ltd. All rights reserved.
// See LICENSE file in the project root for full license information.
//

#pragma once

#include <string>
#include <vector>
#include <iostream>

#include "caffe/proto/caffe.pb.h"

#include "CaffeParser.hpp"



namespace armnnCaffeParser
{

class NetParameterInfo;
class LayerParameterInfo;


class RecordByRecordCaffeParser : public CaffeParserBase
{
public:

    /// Create the network from a protobuf binary file on disk
    virtual armnn::INetworkPtr CreateNetworkFromBinaryFile(
        const char* graphFile,
        const std::map<std::string, armnn::TensorShape>& inputShapes,
        const std::vector<std::string>& requestedOutputs) override;

    RecordByRecordCaffeParser();

private:
    void ProcessLayers(const NetParameterInfo& netParameterInfo,
                       std::vector<LayerParameterInfo>& layerInfo,
                       const std::vector<std::string>& m_RequestedOutputs,
                       std::vector<const LayerParameterInfo*>& sortedNodes);
    armnn::INetworkPtr LoadLayers(std::ifstream& ifs,
                                  std::vector<const LayerParameterInfo *>& sortedNodes,
                                  const NetParameterInfo& netParameterInfo);
    std::vector<const LayerParameterInfo*> GetInputs(
        const LayerParameterInfo& layerParam);

    std::map<std::string, const LayerParameterInfo*> m_CaffeLayersByTopName;
    std::vector<std::string> m_RequestedOutputs;
};

} // namespace armnnCaffeParser

