// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed 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.

#include "test.h"
#include "../internal/allocator.h"

namespace gemmlowp {

void test_allocator(Allocator* a, int max_array_size) {
  const std::size_t int32_array_size = Random() % max_array_size;
  auto handle_to_int32_array = a->Reserve<std::int32_t>(int32_array_size);
  const std::size_t int8_array_size = Random() % max_array_size;
  auto handle_to_int8_array = a->Reserve<std::int8_t>(int8_array_size);
  a->Commit();
  std::int32_t* int32_array =
      a->GetPointer<std::int32_t>(handle_to_int32_array);
  std::int8_t* int8_array = a->GetPointer<std::int8_t>(handle_to_int8_array);
  Check(int32_array == a->GetPointer<std::int32_t>(handle_to_int32_array));
  Check(int8_array == a->GetPointer<std::int8_t>(handle_to_int8_array));
  Check(
      !(reinterpret_cast<std::uintptr_t>(int32_array) % Allocator::kAlignment));
  Check(
      !(reinterpret_cast<std::uintptr_t>(int8_array) % Allocator::kAlignment));
  Check(reinterpret_cast<std::uintptr_t>(int8_array) >=
        reinterpret_cast<std::uintptr_t>(int32_array + int32_array_size));
  memset(int32_array, 0, sizeof(*int32_array) * int32_array_size);
  memset(int8_array, 0, sizeof(*int8_array) * int8_array_size);
  a->Decommit();
}

void test_allocator() {
  Allocator allocator;

  // Test allocating increasingly large sizes on the same allocator,
  // starting with size 0.
  for (int i = 1; i < 1000; i += 10) {
    test_allocator(&allocator, i);
  }
}

}  // namespace gemmlowp

int main() { gemmlowp::test_allocator(); }
