/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. // Description : Generic report class, which contains arbitrary report entries. #ifndef CRYINCLUDE_EDITOR_REPORT_H #define CRYINCLUDE_EDITOR_REPORT_H #pragma once class IReportField { public: virtual ~IReportField() {} virtual const char* GetDescription() const = 0; virtual const char* GetText() const = 0; }; template class CReportField : public IReportField { public: typedef T Object; typedef G TextGetter; CReportField(Object& object, const char* description, TextGetter& getter); virtual const char* GetDescription() const; virtual const char* GetText() const; private: TextGetter m_getter; string m_text; string m_description; }; class IReportRecord { public: virtual ~IReportRecord() {} virtual int GetFieldCount() const = 0; virtual const char* GetFieldDescription(int fieldIndex) const = 0; virtual const char* GetFieldText(int fieldIndex) const = 0; }; template class CReportRecord : public IReportRecord { public: typedef T Object; CReportRecord(Object& object); virtual ~CReportRecord(); virtual int GetFieldCount() const; virtual const char* GetFieldDescription(int fieldIndex) const; virtual const char* GetFieldText(int fieldIndex) const; template CReportField* AddField(const char* description, G& getter); private: Object m_object; typedef std::vector FieldContainer; FieldContainer m_fields; }; class CReport { public: ~CReport(); template CReportRecord* AddRecord(T& object); int GetRecordCount() const; IReportRecord* GetRecord(int recordIndex); void Clear(); private: typedef std::vector RecordContainer; RecordContainer m_records; }; template inline CReportField::CReportField(Object& object, const char* description, TextGetter& getter) : m_getter(getter) , m_description(description) { m_text = m_getter(object); } template inline const char* CReportField::GetDescription() const { return m_description.c_str(); } template inline const char* CReportField::GetText() const { return m_text.c_str(); } template inline CReportRecord::CReportRecord(Object& object) : m_object(object) { } template inline CReportRecord::~CReportRecord() { for (FieldContainer::iterator it = m_fields.begin(); it != m_fields.end(); ++it) { delete (*it); } } template inline int CReportRecord::GetFieldCount() const { return m_fields.size(); } template inline const char* CReportRecord::GetFieldDescription(int fieldIndex) const { return m_fields[fieldIndex]->GetDescription(); } template inline const char* CReportRecord::GetFieldText(int fieldIndex) const { return m_fields[fieldIndex]->GetText(); } template template inline CReportField* CReportRecord::AddField(const char* description, G& getter) { CReportField* field = new CReportField(m_object, description, getter); m_fields.push_back(field); return field; } inline CReport::~CReport() { Clear(); } template inline CReportRecord* CReport::AddRecord(T& object) { CReportRecord* record = new CReportRecord(object); m_records.push_back(record); return record; } inline int CReport::GetRecordCount() const { return m_records.size(); } inline IReportRecord* CReport::GetRecord(int recordIndex) { return m_records[recordIndex]; } inline void CReport::Clear() { for (RecordContainer::iterator it = m_records.begin(); it != m_records.end(); ++it) { delete (*it); } m_records.clear(); } #endif // CRYINCLUDE_EDITOR_REPORT_H