pw_checksum: CRC classes; Update CRC-16-CCITT name

- Rename CcittCrc16 and related functions to Crc16Ccitt, which matches
  the algorithm's full standard name (CRC-16-CCITT).
- Create classes for calculating the CRC-16-CCITT and CRC-32. Use the
  function names, which were nouns, as the class names (Crc16Ccitt and
  Crc32) and provide the functions as class static functions
  (Crc16Ccitt::Calculate and Crc32::Calculate).

Change-Id: I625ed715935de3f1000d3119c21a2f6d01245173
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/17403
Reviewed-by: Keir Mierle <keir@google.com>
diff --git a/pw_checksum/crc32_test.cc b/pw_checksum/crc32_test.cc
index 87b8430..59d649a 100644
--- a/pw_checksum/crc32_test.cc
+++ b/pw_checksum/crc32_test.cc
@@ -17,6 +17,7 @@
 #include <string_view>
 
 #include "gtest/gtest.h"
+#include "pw_bytes/array.h"
 
 namespace pw::checksum {
 namespace {
@@ -27,9 +28,9 @@
 //
 // with polynomial 0x4C11DB7, initial value 0xFFFFFFFF.
 
-constexpr uint8_t kBytes[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
-constexpr uint8_t kBytesPart0[] = {1, 2, 3, 4, 5};
-constexpr uint8_t kBytesPart1[] = {6, 7, 8, 9};
+constexpr auto kBytes = bytes::Array<1, 2, 3, 4, 5, 6, 7, 8, 9>();
+constexpr auto kBytesPart0 = bytes::Array<1, 2, 3, 4, 5>();
+constexpr auto kBytesPart1 = bytes::Array<6, 7, 8, 9>();
 constexpr uint32_t kBufferCrc = 0x40EFAB9E;
 
 constexpr std::string_view kString =
@@ -38,37 +39,51 @@
 constexpr uint32_t kStringCrc = 0x9EC87F88;
 
 TEST(Crc32, Empty) {
-  EXPECT_EQ(Crc32(std::span<std::byte>()), ~kCrc32InitialValue);
-}
-
-TEST(Crc32, ByteByByte) {
-  uint32_t crc;
-  crc = Crc32(std::byte{kBytes[0]});
-  for (size_t i = 1; i < sizeof(kBytes); i++) {
-    crc = Crc32(std::byte{kBytes[i]}, crc);
-  }
-  EXPECT_EQ(crc, kBufferCrc);
+  EXPECT_EQ(Crc32::Calculate(std::span<std::byte>()), PW_CHECKSUM_EMPTY_CRC32);
 }
 
 TEST(Crc32, Buffer) {
-  EXPECT_EQ(Crc32(as_bytes(std::span(kBytes))), kBufferCrc);
-}
-
-TEST(Crc32, BufferAppend) {
-  uint32_t crc = Crc32(as_bytes(std::span(kBytesPart0)));
-  EXPECT_EQ(Crc32(as_bytes(std::span(kBytesPart1)), crc), kBufferCrc);
+  EXPECT_EQ(Crc32::Calculate(std::as_bytes(std::span(kBytes))), kBufferCrc);
 }
 
 TEST(Crc32, String) {
-  EXPECT_EQ(Crc32(as_bytes(std::span(kString))), kStringCrc);
+  EXPECT_EQ(Crc32::Calculate(std::as_bytes(std::span(kString))), kStringCrc);
+}
+
+TEST(Crc32Class, ByteByByte) {
+  Crc32 crc;
+  for (std::byte b : kBytes) {
+    crc.Update(b);
+  }
+  EXPECT_EQ(crc.value(), kBufferCrc);
+}
+
+TEST(Crc32Class, Buffer) {
+  Crc32 crc32;
+  crc32.Update(std::as_bytes(std::span(kBytes)));
+  EXPECT_EQ(crc32.value(), kBufferCrc);
+}
+
+TEST(Crc32Class, BufferAppend) {
+  Crc32 crc32;
+  crc32.Update(kBytesPart0);
+  crc32.Update(kBytesPart1);
+  EXPECT_EQ(crc32.value(), kBufferCrc);
+}
+
+TEST(Crc32Class, String) {
+  Crc32 crc32;
+  crc32.Update(std::as_bytes(std::span(kString)));
+  EXPECT_EQ(crc32.value(), kStringCrc);
 }
 
 extern "C" uint32_t CallChecksumCrc32(const void* data, size_t size_bytes);
 extern "C" uint32_t CallChecksumCrc32Append(const void* data,
-                                            size_t size_bytes);
+                                            size_t size_bytes,
+                                            uint32_t value);
 
 TEST(Crc32FromC, Buffer) {
-  EXPECT_EQ(CallChecksumCrc32(kBytes, sizeof(kBytes)), kBufferCrc);
+  EXPECT_EQ(CallChecksumCrc32(kBytes.data(), kBytes.size()), kBufferCrc);
 }
 
 TEST(Crc32FromC, String) {
@@ -76,11 +91,17 @@
 }
 
 TEST(Crc32AppendFromC, Buffer) {
-  EXPECT_EQ(CallChecksumCrc32(kBytes, sizeof(kBytes)), kBufferCrc);
+  uint32_t crc = PW_CHECKSUM_EMPTY_CRC32;
+  for (std::byte b : kBytes) {
+    crc = CallChecksumCrc32Append(&b, 1, crc);
+  }
+
+  EXPECT_EQ(crc, kBufferCrc);
 }
 
 TEST(Crc32AppendFromC, String) {
-  EXPECT_EQ(CallChecksumCrc32Append(kString.data(), kString.size()),
+  EXPECT_EQ(CallChecksumCrc32Append(
+                kString.data(), kString.size(), PW_CHECKSUM_EMPTY_CRC32),
             kStringCrc);
 }