// Copyright 2024 The Pigweed Authors
//
// 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
//
//     https://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 <array>
#include <cstdint>
#include <string_view>

#include "examples/named_u32.h"
#include "pw_allocator/allocator.h"
#include "pw_allocator/block_allocator.h"
#include "pw_unit_test/framework.h"

namespace examples {

// The "real" `PW_PLACE_IN_SECTION` can be found in pw_preprocessor/compiler.h.
// For the purposes of keeping this example simple and free of linker-scripts,
// the macro is replaced with a no-op version.
#ifdef PW_PLACE_IN_SECTION
#undef PW_PLACE_IN_SECTION
#endif
#define PW_PLACE_IN_SECTION(section)

// DOCSTAG: [pw_allocator-examples-linker_sections-injection]
class NamedU32Factory {
 public:
  explicit NamedU32Factory(pw::Allocator& allocator) : allocator_(allocator) {}

  auto MakeNamedU32(std::string_view name, uint32_t value) {
    return allocator_.MakeUnique<NamedU32>(name, value);
  }

 private:
  pw::Allocator& allocator_;
};
// DOCSTAG: [pw_allocator-examples-linker_sections-injection]

// DOCSTAG: [pw_allocator-examples-linker_sections-placement]
// Set up an object that allocates from SRAM memory.
PW_PLACE_IN_SECTION(".sram") std::array<std::byte, 0x1000> sram_buffer;
pw::allocator::FirstFitBlockAllocator<uint16_t> sram_allocator(sram_buffer);
NamedU32Factory sram_factory(sram_allocator);

// Set up an object that allocates from PSRAM memory.
PW_PLACE_IN_SECTION(".psram") std::array<std::byte, 0x2000> psram_buffer;
pw::allocator::WorstFitBlockAllocator<uint32_t> psram_allocator(psram_buffer);
NamedU32Factory psram_factory(psram_allocator);
// DOCSTAG: [pw_allocator-examples-linker_sections-placement]

}  // namespace examples

namespace pw::allocator {

TEST(LinkerSectionExample, MakeObjects) {
  auto result1 = examples::sram_factory.MakeNamedU32("1", 1);
  EXPECT_NE(result1, nullptr);

  auto result2 = examples::psram_factory.MakeNamedU32("2", 2);
  EXPECT_NE(result2, nullptr);
}

}  // namespace pw::allocator
