10#include "MantidDataObjects/DllConfig.h"
18Kernel::Logger
g_log(
"TableWorkspace");
21struct SortIterationRecord {
22 SortIterationRecord(
size_t ki,
size_t is,
size_t ie) :
keyIndex(ki),
iStart(is),
iEnd(ie) {}
40 auto it = other.m_columns.cbegin();
41 while (it != other.m_columns.cend()) {
42 addColumn(std::shared_ptr<API::Column>((*it)->clone()));
46 m_LogManager = std::make_shared<API::LogManager>(*(other.m_LogManager));
50 size_t data_size = std::accumulate(
m_columns.cbegin(),
m_columns.cend(),
static_cast<size_t>(0),
51 [](
size_t sum,
const auto &column) { return sum + column->sizeOfData(); });
63 throw std::invalid_argument(
"Empty string passed as type argument of addColumn.");
66 throw std::invalid_argument(
"Empty string passed as name argument of addColumn.");
72 ss <<
"Column with name " <<
name <<
" already exists.\n";
73 throw std::invalid_argument(ss.str());
76 c = API::ColumnFactory::Instance().create(type);
82 ss <<
"Column of type " << type <<
" and name " <<
name <<
" has not been added.\n";
83 ss << e.
what() <<
'\n';
84 throw std::invalid_argument(ss.str());
107 std::string str =
"Column " +
name +
" does not exist.\n";
108 throw std::runtime_error(str);
115 [&
name](
const auto &column) { return column->name() == name; });
117 throw std::runtime_error(
"Column " +
name +
" does not exist.");
125 std::stringstream ss;
126 ss <<
"Column index is out of range: " <<
index <<
"(" <<
columnCount() <<
")\n";
127 throw std::range_error(ss.str());
135 std::stringstream ss;
136 ss <<
"Column index is out of range: " <<
index <<
"(" <<
columnCount() <<
")\n";
137 throw std::range_error(ss.str());
145 if (ci->use_count() > 1) {
170 std::stringstream ss;
171 ss <<
"Attempt to delete a non-existing row (" <<
index <<
")\n";
172 throw std::range_error(ss.str());
181 std::vector<std::string> nameList;
184 [](
const auto &column) { return column->name(); });
191 std::stringstream ss;
192 ss <<
"Column with name " << column->name() <<
" already exists.\n";
193 throw std::invalid_argument(ss.str());
206 if (criteria.empty())
210 throw std::runtime_error(
"Too many column names given.");
220 std::vector<size_t> indexVec(nRows);
222 for (
auto i = indexVec.begin() + 1; i != indexVec.end(); ++i) {
228 std::queue<SortIterationRecord> sortRecords;
230 sortRecords.push(SortIterationRecord(0, 0, nRows));
233 const size_t maxNLoops = criteria.size() * nRows / 2;
235 for (
size_t counter = 0; counter < maxNLoops; ++counter) {
237 SortIterationRecord record = sortRecords.front();
240 auto &crt = criteria[record.keyIndex];
241 const std::string columnName = crt.first;
242 const bool ascending = crt.second;
244 std::vector<std::pair<size_t, size_t>> equalRanges;
247 column.sortIndex(ascending, record.iStart, record.iEnd, indexVec, equalRanges);
252 if (record.keyIndex < criteria.size() - 1) {
253 size_t keyIndex = record.keyIndex + 1;
254 for (
auto const &equalRange : equalRanges) {
255 sortRecords.push(SortIterationRecord(
keyIndex, equalRange.first, equalRange.second));
259 if (sortRecords.empty()) {
267 for (
size_t i = 0; i < nCols; ++i) {
276 if (colNames.empty()) {
283 if (colNames.end() != std::find(colNames.begin(), colNames.end(), (**it).name())) {
284 ws->addColumn(std::shared_ptr<API::Column>((*it)->clone()));
289 ws->m_LogManager = std::make_shared<API::LogManager>(*(
m_LogManager));
305IPropertyManager::getValue<DataObjects::TableWorkspace_sptr>(
const std::string &
name)
const {
310 std::string message =
311 "Attempt to assign property " +
name +
" to incorrect type. Expected shared_ptr<TableWorkspace>.";
312 throw std::runtime_error(message);
318IPropertyManager::getValue<DataObjects::TableWorkspace_const_sptr>(
const std::string &
name)
const {
319 auto const *prop =
dynamic_cast<PropertyWithValue<DataObjects::TableWorkspace_sptr> *
>(getPointerToProperty(
name));
321 return prop->operator()();
323 std::string message =
324 "Attempt to assign property " +
name +
" to incorrect type. Expected const shared_ptr<TableWorkspace>.";
325 throw std::runtime_error(message);
std::map< DeltaEMode::Type, std::string > index
#define DECLARE_WORKSPACE(classname)
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
void removeFromColumn(Column *c, size_t index)
Remove an element from a column.
void modified()
If the workspace is the AnalysisDataService sends AfterReplaceNotification.
void insertInColumn(Column *c, size_t index)
Insert a new element into a column.
void resizeColumn(Column *c, size_t size)
Resize a column.
This class contains the information about the log entries.
Used in std::find_if algorithm to find a Column with name name.
TableWorkspace is an implementation of Workspace in which the data are organised in columns of same s...
size_t columnCount() const override
Number of columns in the workspace.
std::vector< std::string > getColumnNames() const override
Returns a vector of all column names.
API::LogManager_sptr m_LogManager
shared pointer to the logManager, responsible for the workspace properties.
size_t insertRow(size_t index) override
Inserts a row before row pointed to by index and fills it with default vales.
size_t rowCount() const override
Number of rows in the workspace.
API::Column_sptr addColumn(const std::string &type, const std::string &name) override
Creates a new column.
TableWorkspace * doCloneColumns(const std::vector< std::string > &colNames) const override
Clone the workspace keeping only selected columns.
size_t getMemorySize() const override
Get the footprint in memory in KB.
void removeColumn(const std::string &name) override
Removes a column.
void removeRow(size_t index) override
Delets a row if it exists.
TableWorkspace(size_t nrows=0)
Constructor.
size_t m_rowCount
row count
API::Column_sptr getColumn(const std::string &name) override
Gets the shared pointer to a column.
std::vector< std::shared_ptr< API::Column > > m_columns
Shared pointers to the columns.
void setRowCount(size_t count) final
Resizes the workspace.
void sort(std::vector< std::pair< std::string, bool > > &criteria) override
Sort this table.
Exception for when an item is not found in a collection.
const char * what() const noexcept override
Writes out the range and limits.
void error(const std::string &msg)
Logs at error level.
The concrete, templated class for properties.
std::shared_ptr< Column > Column_sptr
Kernel::Logger g_log("ExperimentInfo")
static logger object
std::shared_ptr< const Column > Column_const_sptr
std::shared_ptr< TableWorkspace > TableWorkspace_sptr
shared pointer to Mantid::DataObjects::TableWorkspace
std::shared_ptr< const TableWorkspace > TableWorkspace_const_sptr
shared pointer to Mantid::DataObjects::TableWorkspace (const version)