//===-- Scalar.h ------------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_UTILITY_SCALAR_H
#define LLDB_UTILITY_SCALAR_H

#include "lldb/Utility/LLDBAssert.h"
#include "lldb/Utility/Status.h"
#include "lldb/lldb-enumerations.h"
#include "lldb/lldb-private-types.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APSInt.h"
#include <cstddef>
#include <cstdint>
#include <utility>

namespace lldb_private {

class DataExtractor;
class Stream;

#define NUM_OF_WORDS_INT128 2
#define BITWIDTH_INT128 128

// A class designed to hold onto values and their corresponding types.
// Operators are defined and Scalar objects will correctly promote their types
// and values before performing these operations. Type promotion currently
// follows the ANSI C type promotion rules.
class Scalar {
  template<typename T>
  static llvm::APSInt MakeAPSInt(T v) {
    static_assert(std::is_integral<T>::value);
    static_assert(sizeof(T) <= sizeof(uint64_t), "Conversion loses precision!");
    return llvm::APSInt(
        llvm::APInt(sizeof(T) * 8, uint64_t(v), std::is_signed<T>::value),
        std::is_unsigned<T>::value);
  }

public:
  enum Type {
    e_void = 0,
    e_int,
    e_float,
  };

  // Constructors and Destructors
  Scalar() : m_float(0.0f) {}
  Scalar(int v) : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(unsigned int v)
      : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(long v) : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(unsigned long v)
      : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(long long v)
      : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(unsigned long long v)
      : m_type(e_int), m_integer(MakeAPSInt(v)), m_float(0.0f) {}
  Scalar(float v) : m_type(e_float), m_float(v) {}
  Scalar(double v) : m_type(e_float), m_float(v) {}
  Scalar(long double v) : m_type(e_float), m_float(double(v)) {
    bool ignore;
    m_float.convert(llvm::APFloat::x87DoubleExtended(),
                    llvm::APFloat::rmNearestTiesToEven, &ignore);
  }
  Scalar(llvm::APInt v)
      : m_type(e_int), m_integer(std::move(v), false), m_float(0.0f) {}
  Scalar(llvm::APSInt v)
      : m_type(e_int), m_integer(std::move(v)), m_float(0.0f) {}

  bool SignExtend(uint32_t bit_pos);

  bool ExtractBitfield(uint32_t bit_size, uint32_t bit_offset);

  bool SetBit(uint32_t bit);

  bool ClearBit(uint32_t bit);

  /// Store the binary representation of this value into the given storage.
  /// Exactly GetByteSize() bytes will be stored, and the buffer must be large
  /// enough to hold this data.
  void GetBytes(llvm::MutableArrayRef<uint8_t> storage) const;

  size_t GetByteSize() const;

  bool GetData(DataExtractor &data, size_t limit_byte_size = UINT32_MAX) const;

  size_t GetAsMemoryData(void *dst, size_t dst_len,
                         lldb::ByteOrder dst_byte_order, Status &error) const;

  bool IsZero() const;

  void Clear() {
    m_type = e_void;
    m_integer.clearAllBits();
  }

  const char *GetTypeAsCString() const { return GetValueTypeAsCString(m_type); }

  void GetValue(Stream *s, bool show_type) const;

  bool IsValid() const { return (m_type >= e_int) && (m_type <= e_float); }

  /// Convert to an integer with \p bits and the given signedness.
  void TruncOrExtendTo(uint16_t bits, bool sign);

  bool IntegralPromote(uint16_t bits, bool sign);
  bool FloatPromote(const llvm::fltSemantics &semantics);

  bool IsSigned() const;
  bool MakeSigned();

  bool MakeUnsigned();

  static const char *GetValueTypeAsCString(Scalar::Type value_type);

  // All operators can benefits from the implicit conversions that will happen
  // automagically by the compiler, so no temporary objects will need to be
  // created. As a result, we currently don't need a variety of overloaded set
  // value accessors.
  Scalar &operator+=(Scalar rhs);
  Scalar &operator<<=(const Scalar &rhs); // Shift left
  Scalar &operator>>=(const Scalar &rhs); // Shift right (arithmetic)
  Scalar &operator&=(const Scalar &rhs);

  // Shifts the current value to the right without maintaining the current sign
  // of the value (if it is signed).
  bool ShiftRightLogical(const Scalar &rhs); // Returns true on success

  // Takes the absolute value of the current value if it is signed, else the
  // value remains unchanged. Returns false if the contained value has a void
  // type.
  bool AbsoluteValue(); // Returns true on success
  // Negates the current value (even for unsigned values). Returns false if the
  // contained value has a void type.
  bool UnaryNegate(); // Returns true on success
  // Inverts all bits in the current value as long as it isn't void or a
  // float/double/long double type. Returns false if the contained value has a
  // void/float/double/long double type, else the value is inverted and true is
  // returned.
  bool OnesComplement(); // Returns true on success

  // Access the type of the current value.
  Scalar::Type GetType() const { return m_type; }

  // Returns a casted value of the current contained data without modifying the
  // current value. FAIL_VALUE will be returned if the type of the value is
  // void or invalid.
  int SInt(int fail_value = 0) const;

  unsigned char UChar(unsigned char fail_value = 0) const;

  signed char SChar(signed char fail_value = 0) const;

  unsigned short UShort(unsigned short fail_value = 0) const;

  short SShort(short fail_value = 0) const;

  unsigned int UInt(unsigned int fail_value = 0) const;

  long SLong(long fail_value = 0) const;

  unsigned long ULong(unsigned long fail_value = 0) const;

  long long SLongLong(long long fail_value = 0) const;

  unsigned long long ULongLong(unsigned long long fail_value = 0) const;

  llvm::APInt SInt128(const llvm::APInt &fail_value) const;

  llvm::APInt UInt128(const llvm::APInt &fail_value) const;

  float Float(float fail_value = 0.0f) const;

  double Double(double fail_value = 0.0) const;

  long double LongDouble(long double fail_value = 0.0) const;

  Status SetValueFromCString(const char *s, lldb::Encoding encoding,
                             size_t byte_size);

  Status SetValueFromData(const DataExtractor &data, lldb::Encoding encoding,
                          size_t byte_size);

protected:
  Scalar::Type m_type = e_void;
  llvm::APSInt m_integer;
  llvm::APFloat m_float;

  template <typename T> T GetAs(T fail_value) const;

  static Type PromoteToMaxType(Scalar &lhs, Scalar &rhs);

  using PromotionKey = std::tuple<Type, unsigned, bool>;
  PromotionKey GetPromoKey() const;

  static PromotionKey GetFloatPromoKey(const llvm::fltSemantics &semantics);

private:
  friend const Scalar operator+(const Scalar &lhs, const Scalar &rhs);
  friend const Scalar operator-(Scalar lhs, Scalar rhs);
  friend const Scalar operator/(Scalar lhs, Scalar rhs);
  friend const Scalar operator*(Scalar lhs, Scalar rhs);
  friend const Scalar operator&(Scalar lhs, Scalar rhs);
  friend const Scalar operator|(Scalar lhs, Scalar rhs);
  friend const Scalar operator%(Scalar lhs, Scalar rhs);
  friend const Scalar operator^(Scalar lhs, Scalar rhs);
  friend const Scalar operator<<(const Scalar &lhs, const Scalar &rhs);
  friend const Scalar operator>>(const Scalar &lhs, const Scalar &rhs);
  friend bool operator==(Scalar lhs, Scalar rhs);
  friend bool operator!=(const Scalar &lhs, const Scalar &rhs);
  friend bool operator<(Scalar lhs, Scalar rhs);
  friend bool operator<=(const Scalar &lhs, const Scalar &rhs);
  friend bool operator>(const Scalar &lhs, const Scalar &rhs);
  friend bool operator>=(const Scalar &lhs, const Scalar &rhs);
};

// Split out the operators into a format where the compiler will be able to
// implicitly convert numbers into Scalar objects.
//
// This allows code like:
//      Scalar two(2);
//      Scalar four = two * 2;
//      Scalar eight = 2 * four;    // This would cause an error if the
//                                  // operator* was implemented as a
//                                  // member function.
// SEE:
//  Item 19 of "Effective C++ Second Edition" by Scott Meyers
//  Differentiate among members functions, non-member functions, and
//  friend functions
const Scalar operator+(const Scalar &lhs, const Scalar &rhs);
const Scalar operator-(Scalar lhs, Scalar rhs);
const Scalar operator/(Scalar lhs, Scalar rhs);
const Scalar operator*(Scalar lhs, Scalar rhs);
const Scalar operator&(Scalar lhs, Scalar rhs);
const Scalar operator|(Scalar lhs, Scalar rhs);
const Scalar operator%(Scalar lhs, Scalar rhs);
const Scalar operator^(Scalar lhs, Scalar rhs);
const Scalar operator<<(const Scalar &lhs, const Scalar &rhs);
const Scalar operator>>(const Scalar &lhs, const Scalar &rhs);
bool operator==(Scalar lhs, Scalar rhs);
bool operator!=(const Scalar &lhs, const Scalar &rhs);
bool operator<(Scalar lhs, Scalar rhs);
bool operator<=(const Scalar &lhs, const Scalar &rhs);
bool operator>(const Scalar &lhs, const Scalar &rhs);
bool operator>=(const Scalar &lhs, const Scalar &rhs);

llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Scalar &scalar);

} // namespace lldb_private

#endif // LLDB_UTILITY_SCALAR_H
