Sha256: 2453173a7801093dbe29de4769045ea8450da6140bc8cad1a822af1840c014e3

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

// -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil -*-
// Copyright 2017 University of Massachusetts, Amherst

#include <stdalign.h>
#include <cstdint>
#include <cstdlib>

#include "gtest/gtest.h"

#include "common.h"
#include "internal.h"

using namespace mesh;

#define roundtrip(n) ASSERT_TRUE(n == SizeMap::ByteSizeForClass(SizeMap::SizeClass(n)))
#define rt_debug(n) \
  debug("%d c2s: %zu s2c: %d", n, SizeMap::ByteSizeForClass(SizeMap::SizeClass(n)), SizeMap::SizeClass(n))

#define pow2Roundtrip(n) ASSERT_TRUE(n == powerOfTwo::ByteSizeForClass(powerOfTwo::ClassForByteSize(n)))

TEST(SizeClass, MinObjectSize) {
  ASSERT_EQ(alignof(max_align_t), kMinObjectSize);

  ASSERT_EQ(kMinObjectSize, 16UL);

  ASSERT_EQ(staticlog(kMinObjectSize), 4);
}

TEST(SizeClass, SmallClasses) {
  roundtrip(16);
  // rt_debug(16);

  // ASSERT_TRUE(size2Class(8) >= 0);
  // roundtrip(8);
  // rt_debug(8);

  roundtrip(32);
}

TEST(SizeClass, PowerOfTwo) {
  ASSERT_TRUE(powerOfTwo::kMinObjectSize == 8);
  ASSERT_TRUE(powerOfTwo::ClassForByteSize(8) >= 0);

  pow2Roundtrip(8);
  pow2Roundtrip(16);
  pow2Roundtrip(32);
}

TEST(SizeClass, Reciprocal) {
  for (size_t i = 0; i < kClassSizesMax; i++) {
    volatile const size_t objectSize = SizeMap::class_to_size(i);
    // volatile to avoid the compiler compiling it away
    volatile const float recip = 1.0 / (float)objectSize;

    for (size_t j = 0; j <= kPageSize; j += 8) {
      // we depend on this floating point calcuation always being
      // equivalent to the integer division operation
      volatile const size_t off = j * recip;
      volatile const size_t off2 = j / objectSize;
      ASSERT_TRUE(off == off2);
    }

    const size_t newObjectSize = __builtin_roundf(1 / recip);
    ASSERT_TRUE(newObjectSize == objectSize);
  }
}

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mesh-rb-0.0.1 ext/mesh/mesh/src/testing/unit/size_class_test.cc