// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_F2FS_NAMESTRING_H_
#define THIRD_PARTY_F2FS_NAMESTRING_H_

#include "f2fs_layout.h"

namespace f2fs {
class NameString final {
 public:
  NameString() : len_(0){};
  NameString(std::string_view name) {
    ZX_ASSERT(name.length() <= kMaxNameLen);
    len_ = name.length();
    memcpy(name_, name.data(), len_);
  }
  ~NameString() = default;

  std::string_view GetString() const { return std::string_view(name_, len_); };
  char *GetData() { return name_; };
  uint32_t GetLen() const { return len_; };

  NameString &operator=(std::string_view name) {
    ZX_ASSERT(name.length() <= kMaxNameLen);
    len_ = name.length();
    memcpy(name_, name.data(), len_);
    return *this;
  }

 private:
  char name_[kMaxNameLen];
  uint32_t len_;
};

}  // namespace f2fs

#endif  // THIRD_PARTY_F2FS_NAMESTRING_H_
