mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-25 22:50:25 -05:00
#12631 Refactors RFT readers to use unique_ptr
This commit is contained in:
1 parent
61504636b2
commit
0d0c8f5505
18 files changed
+54
-37
No files matched your search
@@ -64,6 +64,8 @@ public:
|
|||||||
return RiaDefines::ResultDataType::DOUBLE;
|
return RiaDefines::ResultDataType::DOUBLE;
|
||||||
case RifEclipseKeywordValueCount::KeywordDataType::INTEGER:
|
case RifEclipseKeywordValueCount::KeywordDataType::INTEGER:
|
||||||
return RiaDefines::ResultDataType::INTEGER;
|
return RiaDefines::ResultDataType::INTEGER;
|
||||||
|
case RifEclipseKeywordValueCount::KeywordDataType::UNKNOWN:
|
||||||
|
return RiaDefines::ResultDataType::UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RiaDefines::ResultDataType::UNKNOWN;
|
return RiaDefines::ResultDataType::UNKNOWN;
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ std::set<RifEclipseRftAddress> RifReaderEclipseRft::eclipseRftAddresses()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RifReaderEclipseRft::values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values )
|
void RifReaderEclipseRft::values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values )
|
||||||
{
|
{
|
||||||
CVF_ASSERT( values );
|
if ( !values ) return;
|
||||||
|
|
||||||
if ( !m_ecl_rft_file )
|
if ( !m_ecl_rft_file )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,8 +24,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "cvfObject.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
|
||||||
namespace caf
|
namespace caf
|
||||||
@@ -37,7 +35,7 @@ class VecIjk;
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
class RifReaderEclipseRft : public RifReaderRftInterface, public cvf::Object
|
class RifReaderEclipseRft : public RifReaderRftInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RifReaderEclipseRft( const QString& fileName );
|
RifReaderEclipseRft( const QString& fileName );
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "cvfObject.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
@@ -32,7 +30,7 @@
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
class RifReaderFmuRft : public RifReaderRftInterface, public cvf::Object
|
class RifReaderFmuRft : public RifReaderRftInterface
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
struct WellDate
|
struct WellDate
|
||||||
|
|||||||
@@ -55,6 +55,11 @@ RifReaderOpmRft::RifReaderOpmRft( const QString& fileName )
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
/// This is required to avoid including the OPM library in the header file
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifReaderOpmRft::~RifReaderOpmRft() = default;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -21,8 +21,6 @@
|
|||||||
#include "RifReaderEclipseRft.h"
|
#include "RifReaderEclipseRft.h"
|
||||||
#include "RifRftSegment.h"
|
#include "RifRftSegment.h"
|
||||||
|
|
||||||
#include "cvfObject.h"
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace Opm
|
namespace Opm
|
||||||
@@ -33,11 +31,12 @@ namespace EclIO
|
|||||||
} // namespace EclIO
|
} // namespace EclIO
|
||||||
} // namespace Opm
|
} // namespace Opm
|
||||||
|
|
||||||
class RifReaderOpmRft : public RifReaderRftInterface, public cvf::Object
|
class RifReaderOpmRft : public RifReaderRftInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RifReaderOpmRft( const QString& fileName );
|
RifReaderOpmRft( const QString& fileName );
|
||||||
RifReaderOpmRft( const QString& fileName, const QString& dataDeckFileName );
|
RifReaderOpmRft( const QString& fileName, const QString& dataDeckFileName );
|
||||||
|
virtual ~RifReaderOpmRft();
|
||||||
|
|
||||||
std::set<RifEclipseRftAddress> eclipseRftAddresses() override;
|
std::set<RifEclipseRftAddress> eclipseRftAddresses() override;
|
||||||
void values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values ) override;
|
void values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values ) override;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
class RifReaderPressureDepthData : public RifReaderRftInterface, public cvf::Object
|
class RifReaderPressureDepthData : public RifReaderRftInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RifReaderPressureDepthData( const QString& filePath );
|
RifReaderPressureDepthData( const QString& filePath );
|
||||||
|
|||||||
@@ -26,6 +26,11 @@
|
|||||||
|
|
||||||
#include "cafVecIjk.h"
|
#include "cafVecIjk.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifReaderRftInterface::~RifReaderRftInterface() = default;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ class RigEclipseWellLogExtractor;
|
|||||||
class RifReaderRftInterface
|
class RifReaderRftInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual ~RifReaderRftInterface();
|
||||||
|
|
||||||
std::set<RifEclipseRftAddress> eclipseRftAddresses( const QString& wellName, const QDateTime& timeStep );
|
std::set<RifEclipseRftAddress> eclipseRftAddresses( const QString& wellName, const QDateTime& timeStep );
|
||||||
virtual std::set<RifEclipseRftAddress> eclipseRftAddresses() = 0;
|
virtual std::set<RifEclipseRftAddress> eclipseRftAddresses() = 0;
|
||||||
virtual void values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values ) = 0;
|
virtual void values( const RifEclipseRftAddress& rftAddress, std::vector<double>* values ) = 0;
|
||||||
|
|||||||
@@ -425,11 +425,11 @@ void RimEclipseResultCase::ensureRftDataIsImported()
|
|||||||
{
|
{
|
||||||
if ( m_useOpmRftReader )
|
if ( m_useOpmRftReader )
|
||||||
{
|
{
|
||||||
m_readerOpmRft = new RifReaderOpmRft( rftFileInfo.filePath() );
|
m_readerOpmRft = std::make_unique<RifReaderOpmRft>( rftFileInfo.filePath() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_readerEclipseRft = new RifReaderEclipseRft( rftFileInfo.filePath() );
|
m_readerEclipseRft = std::make_unique<RifReaderEclipseRft>( rftFileInfo.filePath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -612,9 +612,9 @@ RifReaderRftInterface* RimEclipseResultCase::rftReader()
|
|||||||
{
|
{
|
||||||
ensureRftDataIsImported();
|
ensureRftDataIsImported();
|
||||||
|
|
||||||
if ( m_useOpmRftReader ) return m_readerOpmRft.p();
|
if ( m_useOpmRftReader ) return m_readerOpmRft.get();
|
||||||
|
|
||||||
return m_readerEclipseRft.p();
|
return m_readerEclipseRft.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -27,6 +27,8 @@
|
|||||||
#include "cafFilePath.h"
|
#include "cafFilePath.h"
|
||||||
#include "cafPdmProxyValueField.h"
|
#include "cafPdmProxyValueField.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class RifReaderRftInterface;
|
class RifReaderRftInterface;
|
||||||
class RifReaderEclipseRft;
|
class RifReaderEclipseRft;
|
||||||
class RifReaderOpmRft;
|
class RifReaderOpmRft;
|
||||||
@@ -94,8 +96,8 @@ private:
|
|||||||
private:
|
private:
|
||||||
cvf::ref<RigFlowDiagSolverInterface> m_flowDagSolverInterface;
|
cvf::ref<RigFlowDiagSolverInterface> m_flowDagSolverInterface;
|
||||||
|
|
||||||
cvf::ref<RifReaderEclipseRft> m_readerEclipseRft;
|
std::unique_ptr<RifReaderEclipseRft> m_readerEclipseRft;
|
||||||
cvf::ref<RifReaderOpmRft> m_readerOpmRft;
|
std::unique_ptr<RifReaderOpmRft> m_readerOpmRft;
|
||||||
|
|
||||||
caf::PdmProxyValueField<caf::AppEnum<RiaDefines::EclipseUnitSystem>> m_unitSystem;
|
caf::PdmProxyValueField<caf::AppEnum<RiaDefines::EclipseUnitSystem>> m_unitSystem;
|
||||||
caf::PdmChildArrayField<RimFlowDiagSolution*> m_flowDiagSolutions;
|
caf::PdmChildArrayField<RimFlowDiagSolution*> m_flowDiagSolutions;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void RimObservedFmuRftData::setDirectoryPath( const QString& path )
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimObservedFmuRftData::createRftReaderInterface()
|
void RimObservedFmuRftData::createRftReaderInterface()
|
||||||
{
|
{
|
||||||
m_fmuRftReader = new RifReaderFmuRft( m_directoryPath().path() );
|
m_fmuRftReader = std::make_unique<RifReaderFmuRft>( m_directoryPath().path() );
|
||||||
m_fmuRftReader->importData();
|
m_fmuRftReader->importData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,12 +66,12 @@ void RimObservedFmuRftData::createRftReaderInterface()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderRftInterface* RimObservedFmuRftData::rftReader()
|
RifReaderRftInterface* RimObservedFmuRftData::rftReader()
|
||||||
{
|
{
|
||||||
if ( m_fmuRftReader.isNull() )
|
if ( !m_fmuRftReader )
|
||||||
{
|
{
|
||||||
createRftReaderInterface();
|
createRftReaderInterface();
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_fmuRftReader.p();
|
return m_fmuRftReader.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -95,9 +95,9 @@ bool RimObservedFmuRftData::hasWell( const QString& wellPathName ) const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<QString> RimObservedFmuRftData::wells() const
|
std::vector<QString> RimObservedFmuRftData::wells() const
|
||||||
{
|
{
|
||||||
if ( m_fmuRftReader.p() )
|
if ( m_fmuRftReader )
|
||||||
{
|
{
|
||||||
std::set<QString> wellNames = const_cast<RifReaderFmuRft*>( m_fmuRftReader.p() )->wellNames();
|
std::set<QString> wellNames = m_fmuRftReader->wellNames();
|
||||||
return std::vector<QString>( wellNames.begin(), wellNames.end() );
|
return std::vector<QString>( wellNames.begin(), wellNames.end() );
|
||||||
}
|
}
|
||||||
return std::vector<QString>();
|
return std::vector<QString>();
|
||||||
@@ -108,9 +108,9 @@ std::vector<QString> RimObservedFmuRftData::wells() const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<QString> RimObservedFmuRftData::labels( const RifEclipseRftAddress& rftAddress )
|
std::vector<QString> RimObservedFmuRftData::labels( const RifEclipseRftAddress& rftAddress )
|
||||||
{
|
{
|
||||||
if ( m_fmuRftReader.p() )
|
if ( m_fmuRftReader )
|
||||||
{
|
{
|
||||||
return const_cast<RifReaderFmuRft*>( m_fmuRftReader.p() )->labels( rftAddress );
|
return m_fmuRftReader->labels( rftAddress );
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "RifReaderFmuRft.h"
|
#include "RifReaderFmuRft.h"
|
||||||
|
|
||||||
#include "RimNamedObject.h"
|
#include "RimNamedObject.h"
|
||||||
|
|
||||||
#include "cafPdmField.h"
|
#include "cafPdmField.h"
|
||||||
#include "cafPdmObject.h"
|
#include "cafPdmObject.h"
|
||||||
#include "cafPdmProxyValueField.h"
|
#include "cafPdmProxyValueField.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class RimObservedFmuRftData : public RimNamedObject
|
class RimObservedFmuRftData : public RimNamedObject
|
||||||
{
|
{
|
||||||
CAF_PDM_HEADER_INIT;
|
CAF_PDM_HEADER_INIT;
|
||||||
@@ -44,7 +47,7 @@ protected:
|
|||||||
void initAfterRead() override;
|
void initAfterRead() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cvf::ref<RifReaderFmuRft> m_fmuRftReader;
|
std::unique_ptr<RifReaderFmuRft> m_fmuRftReader;
|
||||||
|
|
||||||
caf::PdmField<caf::FilePath> m_directoryPath;
|
caf::PdmField<caf::FilePath> m_directoryPath;
|
||||||
caf::PdmField<QString> m_directoryPath_OBSOLETE;
|
caf::PdmField<QString> m_directoryPath_OBSOLETE;
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void RimPressureDepthData::setFilePath( const QString& path )
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimPressureDepthData::createRftReaderInterface()
|
void RimPressureDepthData::createRftReaderInterface()
|
||||||
{
|
{
|
||||||
m_fmuRftReader = new RifReaderPressureDepthData( m_filePath().path() );
|
m_fmuRftReader = std::make_unique<RifReaderPressureDepthData>( m_filePath().path() );
|
||||||
m_fmuRftReader->load();
|
m_fmuRftReader->load();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,12 +72,12 @@ void RimPressureDepthData::createRftReaderInterface()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderRftInterface* RimPressureDepthData::rftReader()
|
RifReaderRftInterface* RimPressureDepthData::rftReader()
|
||||||
{
|
{
|
||||||
if ( m_fmuRftReader.isNull() )
|
if ( !m_fmuRftReader )
|
||||||
{
|
{
|
||||||
createRftReaderInterface();
|
createRftReaderInterface();
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_fmuRftReader.p();
|
return m_fmuRftReader.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -101,9 +101,9 @@ bool RimPressureDepthData::hasWell( const QString& wellPathName ) const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<QString> RimPressureDepthData::wellNames() const
|
std::vector<QString> RimPressureDepthData::wellNames() const
|
||||||
{
|
{
|
||||||
if ( m_fmuRftReader.p() )
|
if ( m_fmuRftReader )
|
||||||
{
|
{
|
||||||
std::set<QString> wellNames = const_cast<RifReaderPressureDepthData*>( m_fmuRftReader.p() )->wellNames();
|
std::set<QString> wellNames = m_fmuRftReader->wellNames();
|
||||||
return std::vector<QString>( wellNames.begin(), wellNames.end() );
|
return std::vector<QString>( wellNames.begin(), wellNames.end() );
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
std::vector<QString> wellNames() const;
|
std::vector<QString> wellNames() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cvf::ref<RifReaderPressureDepthData> m_fmuRftReader;
|
std::unique_ptr<RifReaderPressureDepthData> m_fmuRftReader;
|
||||||
|
|
||||||
caf::PdmField<caf::FilePath> m_filePath;
|
caf::PdmField<caf::FilePath> m_filePath;
|
||||||
caf::PdmProxyValueField<std::vector<QString>> m_wells;
|
caf::PdmProxyValueField<std::vector<QString>> m_wells;
|
||||||
|
|||||||
@@ -215,13 +215,13 @@ RifSummaryReaderInterface* RimFileSummaryCase::findRelatedFilesAndCreateReader(
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderOpmRft* RimFileSummaryCase::createOpmRftReader( const QString& rftFileName, const QString& dataDeckFileName )
|
std::unique_ptr<RifReaderOpmRft> RimFileSummaryCase::createOpmRftReader( const QString& rftFileName, const QString& dataDeckFileName )
|
||||||
{
|
{
|
||||||
QFileInfo fi( rftFileName );
|
QFileInfo fi( rftFileName );
|
||||||
|
|
||||||
if ( fi.exists() )
|
if ( fi.exists() )
|
||||||
{
|
{
|
||||||
return new RifReaderOpmRft( rftFileName, dataDeckFileName );
|
return std::make_unique<RifReaderOpmRft>( rftFileName, dataDeckFileName );
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@@ -293,11 +293,11 @@ RifSummaryReaderInterface* RimFileSummaryCase::summaryReader()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderRftInterface* RimFileSummaryCase::rftReader()
|
RifReaderRftInterface* RimFileSummaryCase::rftReader()
|
||||||
{
|
{
|
||||||
if ( m_summaryEclipseRftReader.isNull() )
|
if ( !m_summaryEclipseRftReader )
|
||||||
{
|
{
|
||||||
createRftReaderInterface();
|
createRftReaderInterface();
|
||||||
}
|
}
|
||||||
return m_summaryEclipseRftReader.p();
|
return m_summaryEclipseRftReader.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include "cafPdmField.h"
|
#include "cafPdmField.h"
|
||||||
#include "cvfObject.h"
|
#include "cvfObject.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class RifReaderRftInterface;
|
class RifReaderRftInterface;
|
||||||
class RifReaderOpmRft;
|
class RifReaderOpmRft;
|
||||||
class RifReaderEclipseSummary;
|
class RifReaderEclipseSummary;
|
||||||
@@ -73,13 +75,13 @@ private:
|
|||||||
QString additionalSummaryDataFilePath() const;
|
QString additionalSummaryDataFilePath() const;
|
||||||
static QString createAdditionalSummaryFileName();
|
static QString createAdditionalSummaryFileName();
|
||||||
|
|
||||||
static RifReaderOpmRft* createOpmRftReader( const QString& rftFileName, const QString& dataDeckFileName );
|
static std::unique_ptr<RifReaderOpmRft> createOpmRftReader( const QString& rftFileName, const QString& dataDeckFileName );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cvf::ref<RifSummaryReaderInterface> m_fileSummaryReader;
|
cvf::ref<RifSummaryReaderInterface> m_fileSummaryReader;
|
||||||
cvf::ref<RifCalculatedSummaryCurveReader> m_calculatedSummaryReader;
|
cvf::ref<RifCalculatedSummaryCurveReader> m_calculatedSummaryReader;
|
||||||
cvf::ref<RifMultipleSummaryReaders> m_multiSummaryReader;
|
cvf::ref<RifMultipleSummaryReaders> m_multiSummaryReader;
|
||||||
cvf::ref<RifReaderOpmRft> m_summaryEclipseRftReader;
|
std::unique_ptr<RifReaderOpmRft> m_summaryEclipseRftReader;
|
||||||
caf::PdmField<bool> m_includeRestartFiles;
|
caf::PdmField<bool> m_includeRestartFiles;
|
||||||
|
|
||||||
caf::PdmField<caf::FilePath> m_additionalSummaryFilePath;
|
caf::PdmField<caf::FilePath> m_additionalSummaryFilePath;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in new issue
Block a user