/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#ifndef _cmDocumentationSection_h
#define _cmDocumentationSection_h

#include "cmConfigure.h" // IWYU pragma: keep

#include "cmDocumentationEntry.h"

#include <string>
#include <vector>

// Low-level interface for custom documents:
/** Internal class representing a section of the documentation.
 * Cares e.g. for the different section titles in the different
 * output formats.
 */
class cmDocumentationSection
{
public:
  /** Create a cmSection, with a special name for man-output mode. */
  explicit cmDocumentationSection(const char* name)
    : Name(name)
  {
  }

  /** Has any content been added to this section or is it empty ? */
  bool IsEmpty() const { return this->Entries.empty(); }

  /** Clear contents. */
  void Clear() { this->Entries.clear(); }

  /** Return the name of this section. */
  std::string GetName() const { return this->Name; }

  /** Return a pointer to the first entry of this section. */
  const std::vector<cmDocumentationEntry>& GetEntries() const
  {
    return this->Entries;
  }

  /** Append an entry to this section. */
  void Append(const cmDocumentationEntry& entry)
  {
    this->Entries.push_back(entry);
  }
  void Append(const std::vector<cmDocumentationEntry>& entries)
  {
    this->Entries.insert(this->Entries.end(), entries.begin(), entries.end());
  }

  /** Append an entry to this section using NULL terminated chars */
  void Append(const char* [][2]);
  void Append(const char* n, const char* b);

  /** prepend some documentation to this section */
  void Prepend(const char* [][2]);
  void Prepend(const std::vector<cmDocumentationEntry>& entries)
  {
    this->Entries.insert(this->Entries.begin(), entries.begin(),
                         entries.end());
  }

private:
  std::string Name;
  std::vector<cmDocumentationEntry> Entries;
};

#endif
