diff options
Diffstat (limited to 'src/system_wrappers/interface/data_log.h')
-rw-r--r-- | src/system_wrappers/interface/data_log.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/system_wrappers/interface/data_log.h b/src/system_wrappers/interface/data_log.h new file mode 100644 index 0000000000..6fc1d64495 --- /dev/null +++ b/src/system_wrappers/interface/data_log.h @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +/* + * This singleton can be used for logging data for offline processing. Data + * logged with it can conveniently be parsed and processed with e.g. Matlab. + * + * Following is an example of the log file format, starting with the header + * row at line 1, and the data rows following. + * col1,col2,col3,multi-value-col4[3],,,col5 + * 123,10.2,-243,1,2,3,100 + * 241,12.3,233,1,2,3,200 + * 13,16.4,-13,1,2,3,300 + * + * As can be seen in the example, a multi-value-column is specified with the + * name followed the number of elements it contains. This followed by + * number of elements - 1 empty columns. + * + * Without multi-value-columns this format can be natively by Matlab. With + * multi-value-columns a small Matlab script is needed, available at + * trunk/tools/matlab/parseLog.m. + * + * Table names and column names are case sensitive. + */ + +#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_ +#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_ + +#include <string> + +#include "data_log_impl.h" + +namespace webrtc { + +class DataLog { + public: + // Creates a log which uses a separate thread (referred to as the file + // writer thread) for writing log rows to file. + // + // Calls to this function after the log object has been created will only + // increment the reference counter. + static int CreateLog(); + + // Decrements the reference counter and deletes the log when the counter + // reaches 0. Should be called equal number of times as successful calls to + // CreateLog or memory leak will occur. + static void ReturnLog(); + + // Combines the string table_name and the integer table_id into a new string + // table_name + _ + table_id. The new string will be lower-case. + static std::string Combine(const std::string& table_name, int table_id); + + // Adds a new table, with the name table_name, and creates the file, with the + // name table_name + ".txt", to which the table will be written. + // table_name is treated in a case sensitive way. + static int AddTable(const std::string& table_name); + + // Adds a new column to a table. The column will be a multi-value-column + // if multi_value_length is greater than 1. + // table_name and column_name are treated in a case sensitive way. + static int AddColumn(const std::string& table_name, + const std::string& column_name, + int multi_value_length); + + // Inserts a single value into a table with name table_name at the column with + // name column_name. + // Note that the ValueContainer makes use of the copy constructor, + // operator= and operator<< of the type T, and that the template type must + // implement a deep copy copy constructor and operator=. + // Copy constructor and operator= must not be disabled for the type T. + // table_name and column_name are treated in a case sensitive way. + template<class T> + static int InsertCell(const std::string& table_name, + const std::string& column_name, + T value) { + DataLogImpl* data_log = DataLogImpl::StaticInstance(); + if (data_log == NULL) + return -1; + return data_log->InsertCell( + table_name, + column_name, + new ValueContainer<T>(value)); + } + + // Inserts an array of values into a table with name table_name at the + // column specified by column_name, which must be a multi-value-column. + // Note that the MultiValueContainer makes use of the copy constructor, + // operator= and operator<< of the type T, and that the template type + // must implement a deep copy copy constructor and operator=. + // Copy constructor and operator= must not be disabled for the type T. + // table_name and column_name are treated in a case sensitive way. + template<class T> + static int InsertCell(const std::string& table_name, + const std::string& column_name, + const T* array, + int length) { + DataLogImpl* data_log = DataLogImpl::StaticInstance(); + if (data_log == NULL) + return -1; + return data_log->InsertCell( + table_name, + column_name, + new MultiValueContainer<T>(array, length)); + } + + // For the table with name table_name: Writes the current row to file. + // Starts a new empty row. + // table_name is treated in a case-sensitive way. + static int NextRow(const std::string& table_name); +}; + +} // namespace webrtc + +#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_ |