//===- llvm/unittest/ADT/PointerIntPairTest.cpp - Unit tests --------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "llvm/ADT/PointerIntPair.h"
#include "gtest/gtest.h"
#include <limits>
using namespace llvm;

namespace {

TEST(PointerIntPairTest, GetSet) {
  struct S {
    int i;
  };
  S s;

  PointerIntPair<S *, 2> Pair(&s, 1U);
  EXPECT_EQ(&s, Pair.getPointer());
  EXPECT_EQ(1U, Pair.getInt());

  Pair.setInt(2);
  EXPECT_EQ(&s, Pair.getPointer());
  EXPECT_EQ(2U, Pair.getInt());

  Pair.setPointer(nullptr);
  EXPECT_EQ(nullptr, Pair.getPointer());
  EXPECT_EQ(2U, Pair.getInt());

  Pair.setPointerAndInt(&s, 3U);
  EXPECT_EQ(&s, Pair.getPointer());
  EXPECT_EQ(3U, Pair.getInt());

  // Make sure that we can perform all of our operations on enum classes.
  //
  // The concern is that enum classes are only explicitly convertible to
  // integers. This means that if we assume in PointerIntPair this, a
  // compilation error will result. This group of tests exercises the enum class
  // code to make sure that we do not run into such issues in the future.
  enum class E : unsigned {
    Case1,
    Case2,
    Case3,
  };
  PointerIntPair<S *, 2, E> Pair2(&s, E::Case1);
  EXPECT_EQ(&s, Pair2.getPointer());
  EXPECT_EQ(E::Case1, Pair2.getInt());

  Pair2.setInt(E::Case2);
  EXPECT_EQ(&s, Pair2.getPointer());
  EXPECT_EQ(E::Case2, Pair2.getInt());

  Pair2.setPointer(nullptr);
  EXPECT_EQ(nullptr, Pair2.getPointer());
  EXPECT_EQ(E::Case2, Pair2.getInt());

  Pair2.setPointerAndInt(&s, E::Case3);
  EXPECT_EQ(&s, Pair2.getPointer());
  EXPECT_EQ(E::Case3, Pair2.getInt());

  static_assert(is_trivially_copyable<PointerIntPair<S *, 2, E>>::value,
                "trivially copyable");
}

TEST(PointerIntPairTest, DefaultInitialize) {
  PointerIntPair<float *, 2> Pair;
  EXPECT_EQ(nullptr, Pair.getPointer());
  EXPECT_EQ(0U, Pair.getInt());
}

TEST(PointerIntPairTest, ManyUnusedBits) {
  // In real code this would be a word-sized integer limited to 31 bits.
  struct Fixnum31 {
    uintptr_t Value;
  };
  class FixnumPointerTraits {
  public:
    static inline void *getAsVoidPointer(Fixnum31 Num) {
      return reinterpret_cast<void *>(Num.Value << NumLowBitsAvailable);
    }
    static inline Fixnum31 getFromVoidPointer(void *P) {
      // In real code this would assert that the value is in range.
      return { reinterpret_cast<uintptr_t>(P) >> NumLowBitsAvailable };
    }
    enum { NumLowBitsAvailable = std::numeric_limits<uintptr_t>::digits - 31 };
  };

  PointerIntPair<Fixnum31, 1, bool, FixnumPointerTraits> pair;
  EXPECT_EQ((uintptr_t)0, pair.getPointer().Value);
  EXPECT_FALSE(pair.getInt());

  pair.setPointerAndInt({ 0x7FFFFFFF }, true );
  EXPECT_EQ((uintptr_t)0x7FFFFFFF, pair.getPointer().Value);
  EXPECT_TRUE(pair.getInt());

  EXPECT_EQ(FixnumPointerTraits::NumLowBitsAvailable - 1,
            PointerLikeTypeTraits<decltype(pair)>::NumLowBitsAvailable);

  static_assert(
      is_trivially_copyable<
          PointerIntPair<Fixnum31, 1, bool, FixnumPointerTraits>>::value,
      "trivially copyable");
}

} // end anonymous namespace
