//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once

#include "LayerWithParameters.hpp"

namespace armnn
{
/// This layer represents an activation operation with the specified activation function.
class ActivationLayer : public LayerWithParameters<ActivationDescriptor>
{
public:
    /// Makes a workload for the Activation type.
    /// @param [in] graph The graph where this layer can be found.
    /// @param [in] factory The workload factory which will create the workload.
    /// @return A pointer to the created workload, or nullptr if not created.
    virtual std::unique_ptr<IWorkload> CreateWorkload(const IWorkloadFactory& factory) const override;

    /// Creates a dynamically-allocated copy of this layer.
    /// @param [in] graph The graph into which this layer is being cloned.
    ActivationLayer* Clone(Graph& graph) const override;

    /// Check if the input tensor shape(s) will lead to a valid configuration of @ref ActivationLayer.
    /// @param [in] shapeInferenceMethod Indicates if output shape shall be overwritten or just validated.
    void ValidateTensorShapesFromInputs(
            ShapeInferenceMethod shapeInferenceMethod = ShapeInferenceMethod::ValidateOnly) override;

    void Accept(ILayerVisitor& visitor) const override;


protected:
    /// Constructor to create an ActivationLayer.
    /// @param [in] param ActivationDescriptor to configure the activation operation.
    /// @param [in] name Optional name for the layer.
    ActivationLayer(const ActivationDescriptor &param, const char* name);

    /// Default destructor
    ~ActivationLayer() = default;
};

} // namespace
