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

#include <iostream>
#include <sstream>

#include <armnn/Exceptions.hpp>

namespace armnnUtils
{

void CheckValidSize(std::initializer_list<size_t> validInputCounts,
                    size_t actualValue,
                    const char* validExpr,
                    const char* actualExpr,
                    const armnn::CheckLocation& location);

uint32_t NonNegative(const char* expr,
                     int32_t value,
                     const armnn::CheckLocation& location);

int32_t VerifyInt32(const char* expr,
                    int64_t value,
                    const armnn::CheckLocation& location);

}//armnnUtils

#define CHECKED_INT32(VALUE) armnnUtils::VerifyInt32(#VALUE, VALUE, CHECK_LOCATION())

#define CHECK_VALID_SIZE(ACTUAL, ...) \
armnnUtils::CheckValidSize({__VA_ARGS__}, ACTUAL, #__VA_ARGS__, #ACTUAL, CHECK_LOCATION())

#define CHECKED_NON_NEGATIVE(VALUE) armnnUtils::NonNegative(#VALUE, VALUE, CHECK_LOCATION())
