ChunkID.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2023, kleines Filmröllchen <filmroellchen@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Array.h>
  8. #include <AK/Endian.h>
  9. #include <AK/Format.h>
  10. #include <AK/StringView.h>
  11. #include <AK/Types.h>
  12. namespace RIFF {
  13. static constexpr size_t const chunk_id_size = 4;
  14. // Also referred to as "FourCC" (four character code) in the context of some formats.
  15. struct ChunkID {
  16. constexpr ChunkID(char const name[4])
  17. {
  18. id_data[0] = static_cast<u8>(name[0]);
  19. id_data[1] = static_cast<u8>(name[1]);
  20. id_data[2] = static_cast<u8>(name[2]);
  21. id_data[3] = static_cast<u8>(name[3]);
  22. }
  23. constexpr ChunkID(Array<u8, chunk_id_size> data)
  24. : id_data(data)
  25. {
  26. }
  27. constexpr ChunkID(ChunkID const&) = default;
  28. constexpr ChunkID(ChunkID&&) = default;
  29. constexpr ChunkID& operator=(ChunkID const&) = default;
  30. static constexpr ChunkID from_number(u32 number)
  31. {
  32. return Array<u8, chunk_id_size> { {
  33. static_cast<u8>((number >> 24) & 0xff),
  34. static_cast<u8>((number >> 16) & 0xff),
  35. static_cast<u8>((number >> 8) & 0xff),
  36. static_cast<u8>(number & 0xff),
  37. } };
  38. }
  39. static ErrorOr<ChunkID> read_from_stream(Stream& stream);
  40. StringView as_ascii_string() const;
  41. constexpr u32 as_number() const
  42. {
  43. return (id_data[0] << 24) | (id_data[1] << 16) | (id_data[2] << 8) | id_data[3];
  44. }
  45. bool operator==(ChunkID const&) const = default;
  46. bool operator==(StringView) const;
  47. Array<u8, chunk_id_size> id_data;
  48. };
  49. static_assert(AssertSize<ChunkID, chunk_id_size>());
  50. }
  51. template<>
  52. struct AK::Formatter<RIFF::ChunkID> : StandardFormatter {
  53. ErrorOr<void> format(FormatBuilder& builder, RIFF::ChunkID const& chunk_id)
  54. {
  55. TRY(builder.put_padding('\'', 1));
  56. TRY(builder.put_literal(chunk_id.as_ascii_string()));
  57. TRY(builder.put_padding('\'', 1));
  58. return {};
  59. }
  60. };