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

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

#include <string>

#include "cmParseMumpsCoverage.h"

class cmCTest;
class cmCTestCoverageHandlerContainer;

/** \class cmParseGTMCoverage
 * \brief Parse GTM coverage information
 *
 * This class is used to parse GTM coverage information for
 * mumps.
 */
class cmParseGTMCoverage : public cmParseMumpsCoverage
{
public:
  cmParseGTMCoverage(cmCTestCoverageHandlerContainer& cont, cmCTest* ctest);

protected:
  // implement virtual from parent
  bool LoadCoverageData(std::string const& dir) override;
  // Read a single mcov file
  bool ReadMCovFile(const char* f);
  // find out what line in a mumps file (filepath) the given entry point
  // or function is.  lineoffset is set by this method.
  bool FindFunctionInMumpsFile(std::string const& filepath,
                               std::string const& function, int& lineoffset);
  // parse a line from a .mcov file, and fill in the
  // routine, function, linenumber and coverage count
  bool ParseMCOVLine(std::string const& line, std::string& routine,
                     std::string& function, int& linenumber, int& count);
};

#endif
