Files
LBPM/common/Database.h
2018-05-15 11:30:12 -04:00

297 lines
8.3 KiB
C++

#ifndef included_Database
#define included_Database
#include <fstream>
#include <iostream>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "common/Units.h"
inline bool exists( const std::string& filename )
{
std::ifstream domain( filename );
return domain.good();
}
//! Base class to hold data of a given type
class KeyData
{
protected:
//! Empty constructor
KeyData() {}
public:
//! Destructor
virtual ~KeyData() {}
//! Copy the data
virtual std::shared_ptr<KeyData> clone() const = 0;
//! Print the data to a stream
virtual void print( std::ostream& os, const std::string& indent = "" ) const = 0;
//! Return the native data type
virtual std::string type() const = 0;
protected:
KeyData( const KeyData& ) {}
KeyData& operator=( const KeyData& );
};
//! Class to a database
class Database : public KeyData
{
public:
//! Empty constructor
Database();
/**
* Open an database file.
* @param filename Name of input file to open
*/
explicit Database( const std::string& filename );
/**
* Create database from string
* @param data String containing the database data
*/
static std::shared_ptr<Database> createFromString( const std::string& data );
//! Copy constructor
Database( const Database& );
//! Assignment operator
Database& operator=( const Database& );
//! Move constructor
Database( Database&& rhs );
//! Move assignment operator
Database& operator=( Database&& rhs );
//! Destructor
virtual ~Database();
//! Copy the data
virtual std::shared_ptr<KeyData> clone() const override;
//! Copy the data
std::shared_ptr<Database> cloneDatabase() const;
/**
* Return true if the specified key exists in the database and false
* otherwise.
* @param[in] key Key name to lookup.
*/
bool keyExists( const std::string& key ) const;
/**
* Return all keys in the database.
*/
std::vector<std::string> getAllKeys() const;
//! Return the number of entries in the database
size_t size() const { return d_data.size(); }
/**
* Get the scalar entry from the database with the specified key
* name. If the specified key does not exist in the database or
* is not a scalar of the given type, then an error message is printed and
* the program exits.
*
* @param[in] key Key name in database.
* @param[in] unit Desired units
*/
template<class TYPE>
inline TYPE getScalar( const std::string& key, const Units& unit = Units() ) const;
/// @copydoc Database::getScalar(const std::string&,const Units&) const
template<class TYPE>
inline TYPE getScalar( const std::string& key, const std::string& unit ) const;
/**
* Get the scalar entry from the database with the specified key
* name. If the specified key does not exist in the database the
* the default value will be printed
*
* @param[in] key Key name in database
* @param[in] value Default value
* @param[in] unit Desired units
*/
template<class TYPE>
inline TYPE getWithDefault(
const std::string& key, const TYPE& value, const Units& unit = Units() ) const;
/// @copydoc Database::getWithDefault(const std::string&,const TYPE&,const Units&) const
template<class TYPE>
inline TYPE getWithDefault(
const std::string& key, const TYPE& value, const std::string& unit ) const;
/**
* Put the scalar entry into the database with the specified key name.
* @param key Key name in database.
* @param value Value to store
* @param unit Desired units
*/
template<class TYPE>
inline void putScalar( const std::string& key, const TYPE& value, const Units& unit = Units() );
/**
* Put the scalar entry into the database with the specified key name.
* @param key Key name in database.
* @param value Value to store
* @param unit Desired units
*/
template<class TYPE>
inline void putScalar( const std::string& key, const TYPE& value, const std::string& unit );
/**
* Get the vector entries from the database with the specified key
* name. If the specified key does not exist in the database or
* is not of the given type, then an error message is printed and
* the program exits.
*
* @param key Key name in database.
* @param unit Desired units
*/
template<class TYPE>
std::vector<TYPE> getVector( const std::string& key, const Units& unit = Units() ) const;
/// @copydoc Database::getVector(const std::string&,const Units&) const
template<class TYPE>
inline std::vector<TYPE> getVector( const std::string& key, const std::string& unit ) const;
/**
* Put the vector entries into the database with the specified key
* name. If the specified key does not exist in the database or
* is not of the given type, then an error message is printed and
* the program exits.
*
* @param key Key name in database.
* @param data Data to store
* @param unit Desired units
*/
template<class TYPE>
void putVector(
const std::string& key, const std::vector<TYPE>& data, const Units& unit = Units() );
/// @copydoc Database::putVector(const std::string&,const std::vector<TYPE>&,const Units&)
template<class TYPE>
inline void putVector(
const std::string& key, const std::vector<TYPE>& data, const std::string& unit );
/**
* Get the data for a key in the database. If the specified key
* does not exist in the database an error message is printed and
* the program exits.
*
* @param key Key name in database.
*/
std::shared_ptr<KeyData> getData( const std::string& key );
/**
* Get the data for a key in the database. If the specified key
* does not exist in the database an error message is printed and
* the program exits.
*
* @param key Key name in database.
*/
std::shared_ptr<const KeyData> getData( const std::string& key ) const;
/**
* Put the data for a key in the database.
*
* @param key Key name in database.
* @param data Data to store
*/
void putData( const std::string& key, std::shared_ptr<KeyData> data );
// Check if the key is a database object
bool isDatabase( const std::string& key ) const;
// Check if the entry can be stored as the given type
template<class TYPE>
bool isType( const std::string& key ) const;
/**
* Get the database for a key in the database. If the specified key
* does not exist in the database an error message is printed and
* the program exits.
*
* @param key Key name in database.
*/
std::shared_ptr<Database> getDatabase( const std::string& key );
/**
* Get the database for a key in the database. If the specified key
* does not exist in the database an error message is printed and
* the program exits.
*
* @param key Key name in database.
*/
std::shared_ptr<const Database> getDatabase( const std::string& key ) const;
/**
* Get the database for a key in the database. If the specified key
* does not exist in the database an error message is printed and
* the program exits.
*
* @param key Key name in database.
* @param db Database to store
*/
void putDatabase( const std::string& key, std::shared_ptr<Database> db );
/**
* Print the data to a stream
* @param os Output stream
* @param indent Indenting to use before each line
*/
virtual void print( std::ostream& os, const std::string& indent = "" ) const override;
//! Print the type
virtual std::string type() const override { return "database"; }
/**
* Print the data to a string
* @return Output string
*/
std::string print( const std::string& indent = "" ) const;
protected:
std::map<std::string, std::shared_ptr<KeyData>> d_data;
// Function to load a database from a buffer
static size_t loadDatabase( const char* buffer, Database& db );
};
#include "common/Database.hpp"
#endif