blob: 8d0e1f2d6830f54fc3bc6d5831ce43a48a1861e0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#pragma once
#include "big_decimal.h"
#include "big_integer.h"
#include "ignite_date.h"
#include "ignite_date_time.h"
#include "ignite_duration.h"
#include "ignite_error.h"
#include "ignite_period.h"
#include "ignite_time.h"
#include "ignite_timestamp.h"
#include "ignite_type.h"
#include "uuid.h"
#include <cstdint>
#include <optional>
#include <type_traits>
#include <variant>
#include <vector>
namespace ignite {
/**
* Ignite primitive type.
*/
class primitive {
public:
// Default
primitive() = default;
/**
* Null constructor.
*/
primitive(std::nullptr_t) {} // NOLINT(google-explicit-constructor)
/**
* Null option constructor.
*/
primitive(std::nullopt_t) {} // NOLINT(google-explicit-constructor)
/**
* Constructor for boolean value.
*
* @param value Value.
*/
primitive(bool value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for std::int8_t value.
*
* @param value Value.
*/
primitive(std::int8_t value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for std::int16_t value.
*
* @param value Value.
*/
primitive(std::int16_t value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for std::int32_t value.
*
* @param value Value.
*/
primitive(std::int32_t value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for std::int64_t value.
*
* @param value Value.
*/
primitive(std::int64_t value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for float value.
*
* @param value Value.
*/
primitive(float value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for double value.
*
* @param value Value.
*/
primitive(double value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for UUID value.
*
* @param value Value.
*/
primitive(uuid value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for string value.
*
* @param value Value.
*/
primitive(std::string value) // NOLINT(google-explicit-constructor)
: m_value(std::move(value)) {}
/**
* Constructor for string value.
*
* @param value Value.
*/
primitive(std::string_view value) // NOLINT(google-explicit-constructor)
: m_value(std::string(value)) {}
/**
* Constructor for string value.
*
* @param value Value.
*/
primitive(const char *value) // NOLINT(google-explicit-constructor)
: m_value(std::string(value)) {}
/**
* Constructor for byte array value.
*
* @param value Value.
*/
primitive(std::vector<std::byte> value) // NOLINT(google-explicit-constructor)
: m_value(std::move(value)) {}
/**
* Constructor for byte array value.
*
* @param buf Buffer.
* @param len Buffer length.
*/
primitive(std::byte *buf, std::size_t len)
: m_value(std::vector<std::byte>(buf, buf + len)) {}
/**
* Constructor for big decimal value.
*
* @param value Value.
*/
primitive(big_decimal value) // NOLINT(google-explicit-constructor)
: m_value(std::move(value)) {}
/**
* Constructor for date value.
*
* @param value Value.
*/
primitive(ignite_date value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for date-time value.
*
* @param value Value.
*/
primitive(ignite_date_time value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for time value.
*
* @param value Value.
*/
primitive(ignite_time value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for timestamp value.
*
* @param value Value.
*/
primitive(ignite_timestamp value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for period value.
*
* @param value Value.
*/
primitive(ignite_period value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Constructor for duration value.
*
* @param value Value.
*/
primitive(ignite_duration value) // NOLINT(google-explicit-constructor)
: m_value(value) {}
/**
* Get underlying value.
*
* @tparam T Type of value to try and get.
* @return Value of the specified type.
* @throw ignite_error if primitive contains value of any other type.
*/
template<typename T>
[[nodiscard]] const T &get() const {
if constexpr (std::is_same_v<T, bool> // Bool
|| std::is_same_v<T, std::int8_t> // Int8
|| std::is_same_v<T, std::int16_t> // Int16
|| std::is_same_v<T, std::int32_t> // Int32
|| std::is_same_v<T, std::int64_t> // Int64
|| std::is_same_v<T, float> // Float
|| std::is_same_v<T, double> // Double
|| std::is_same_v<T, uuid> // Uuid
|| std::is_same_v<T, std::string> // String
|| std::is_same_v<T, std::vector<std::byte>> // Bytes
|| std::is_same_v<T, big_decimal> // Decimal
|| std::is_same_v<T, ignite_date> // Date
|| std::is_same_v<T, ignite_date_time> // DateTime
|| std::is_same_v<T, ignite_time> // Time
|| std::is_same_v<T, ignite_timestamp> // Timestamp
|| std::is_same_v<T, ignite_period> // Period
|| std::is_same_v<T, ignite_duration> // Duration
) {
return std::get<T>(m_value);
} else {
static_assert(sizeof(T) == 0, "Type is not an Ignite primitive type or is not yet supported");
}
}
/**
* Check whether element is null.
*
* @return Value indicating whether element is null.
*/
[[nodiscard]] bool is_null() const noexcept { return m_value.index() == 0; }
/**
* Get primitive type.
*
* @return Primitive type.
*/
[[nodiscard]] ignite_type get_type() const noexcept {
auto type_idx = m_value.index();
type_idx = type_idx <= 13 ? type_idx : type_idx + 1;
return static_cast<ignite_type>(type_idx);
}
/**
* @brief Comparison operator.
*
* @param lhs First value.
* @param rhs Second value.
* @return true If values are equal.
*/
friend constexpr bool operator==(const primitive &lhs, const primitive &rhs) noexcept {
return lhs.m_value == rhs.m_value;
}
/**
* @brief Comparison operator.
*
* @param lhs First value.
* @param rhs Second value.
* @return true If values are not equal.
*/
friend constexpr bool operator!=(const primitive &lhs, const primitive &rhs) noexcept {
return lhs.m_value != rhs.m_value;
}
private:
/** Value type. */
typedef std::variant<std::nullptr_t, // Null = 0
bool, // Bool = 1
std::int8_t, // Int8 = 2
std::int16_t, // Int16 = 3
std::int32_t, // Int32 = 4
std::int64_t, // Int64 = 5
float, // Float = 6
double, // Double = 7
big_decimal, // Decimal = 8
ignite_date, // Date = 9
ignite_time, // Time = 10
ignite_date_time, // Datetime = 11
ignite_timestamp, // Timestamp = 12
uuid, // UUID = 13
std::string, // String = 15
std::vector<std::byte>, // Bytes = 16
ignite_period, // Period = 17
ignite_duration // Duration = 18
>
value_type;
/** Value. */
value_type m_value;
};
} // namespace ignite