Program Listing for File Dimensions.hpp

Return to documentation for file (include/nix/Dimensions.hpp)

// Copyright (c) 2013, German Neuroinformatics Node (G-Node)
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted under the terms of the BSD License. See
// LICENSE file in the root of the Project.

#ifndef NIX_DIMENSIONS_H
#define NIX_DIMENSIONS_H

#include <nix/base/ImplContainer.hpp>
#include <nix/base/IDimensions.hpp>

#include <nix/DataFrame.hpp>

namespace nix {
class DataArray;
class Dimension;

enum class PositionMatch {
                          Equal,
                          Less,
                          Greater,
                          GreaterOrEqual,
                          LessOrEqual
};

enum class RangeMatch {
                       Inclusive,
                       Exclusive
};

enum class PositionInRange{
                          InRange,
                          Greater,
                          Less,

                          NoRange = -1
};

class NIXAPI SampledDimension : public base::ImplContainer<base::ISampledDimension> {

public:

    SampledDimension();

    SampledDimension(const std::shared_ptr<base::ISampledDimension> &p_impl);

    SampledDimension(std::shared_ptr<base::ISampledDimension> &&ptr);

    SampledDimension(const SampledDimension &other);

    ndsize_t index() const {
        return backend()->index();
    }

    DimensionType dimensionType() const {
        return backend()->dimensionType();
    }

    boost::optional<std::string> label() const {
        return backend()->label();
    }

    void label(const std::string &label);

    void label(const none_t t) {
        backend()->label(t);
    }

    boost::optional<std::string> unit() const {
        return backend()->unit();
    }

    void unit(const std::string &unit);

    void unit(const none_t t) {
        backend()->unit(t);
    }

    double samplingInterval() const {
       return backend()->samplingInterval();
    }

    void samplingInterval(double interval);

    boost::optional<double> offset() const {
        return backend()->offset();
    }

    void offset(double offset) {
        return backend()->offset(offset);
    }

    void offset(const boost::none_t t) {
        backend()->offset(t);
    }

    DEPRECATED ndsize_t indexOf(const double position) const;

    boost::optional<ndsize_t> indexOf(const double position, PositionMatch match) const;


    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(const double start, const double end, RangeMatch match) const;

    DEPRECATED std::pair<ndsize_t, ndsize_t> indexOf(const double start, const double end) const;

    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(double start, double end, const double sampling_interval, const double offset,
                                                           const RangeMatch match) const;


    std::vector<boost::optional<std::pair<ndsize_t, ndsize_t>>> indexOf(const std::vector<double> &start_positions,
                                                                        const std::vector<double> &end_positions,
                                                                        const RangeMatch match) const;

    DEPRECATED std::vector<std::pair<ndsize_t, ndsize_t>> indexOf(const std::vector<double> &start_positions,
                                                                  const std::vector<double> &end_positions) const;



    double positionAt(const ndsize_t index) const;

    std::vector<double> axis(const ndsize_t count, const ndsize_t startIndex = 0) const;

    SampledDimension& operator=(const SampledDimension &other);

    SampledDimension& operator=(const Dimension &other);

    SampledDimension &operator=(const none_t &t) {
        ImplContainer::operator=(t);
        return *this;
    }

    double operator[](const ndsize_t index) {
        return positionAt(index);
    }
};


class NIXAPI DataFrameDimension : public base::ImplContainer<base::IDataFrameDimension> {

 public:
    DataFrameDimension();

    DataFrameDimension(const std::shared_ptr<base::IDataFrameDimension> &p_impl);

    DataFrameDimension(std::shared_ptr<base::IDataFrameDimension> &&ptr);

    DataFrameDimension(const DataFrameDimension &other);

    boost::optional<unsigned> columnIndex() const {
        return backend()->columnIndex();
    }

    std::shared_ptr<base::IDataFrame> data() const {
        return backend()->dataFrame();
    };

    std::string label(boost::optional<unsigned> col_index = {}) const {
        return backend()->label(col_index);
    }

    std::string unit(boost::optional<unsigned> col_index = {}) const {
        return backend()->unit(col_index);
    }

    nix::DataType columnDataType(boost::optional<unsigned> col_index = {}) const {
        return backend()->columnDataType(col_index);
    }

    template<typename T>
    void ticks(std::vector<T> &ticks, boost::optional<unsigned> col_index = {}, bool resize=false, ndsize_t offset=0) const {
        nix::DataFrame df = data();
        boost::optional<unsigned> column_index;
        if (!col_index) {
            column_index = columnIndex();
        } else {
            column_index = col_index;
        }
        if (!column_index) {
            throw nix::OutOfBounds("DataFrameDimension: Error accessing column, no column index was given and no default is specified.");
        }
        std::vector<Column> cols = df.columns();
        if (static_cast<size_t>(*column_index) >= cols.size()) {
            throw nix::OutOfBounds("DataFrameDimension: Error accessing column, column index exceeds number of columns!");
        }
        df.readColumn(*column_index, ticks, true, offset);
    }

    boost::optional<ndsize_t> indexOf(const double position, const PositionMatch match) const;

    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(double start_position, double end_position, RangeMatch range_match) const;

    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(double start_position, double end_position, ndsize_t tick_count, RangeMatch range_match) const;

    std::vector<boost::optional<std::pair<ndsize_t, ndsize_t>>> indexOf(const std::vector<double> &start_positions,
                                                                        const std::vector<double> &end_positions,
                                                                        const RangeMatch range_match) const;

    ndsize_t size() const {
        nix::DataFrame df = data();
        return df.rows();
    }

    DimensionType dimensionType() const {
        return backend()->dimensionType();
    }

    DataFrameDimension& operator=(const DataFrameDimension &other);

    DataFrameDimension& operator=(const Dimension &other);

    DataFrameDimension &operator=(const none_t &t) {
        ImplContainer::operator=(t);
        return *this;
    }
};

class NIXAPI SetDimension : public base::ImplContainer<base::ISetDimension> {

public:

    SetDimension();

    SetDimension(const std::shared_ptr<base::ISetDimension> &p_impl);

    SetDimension(std::shared_ptr<base::ISetDimension> &&ptr);

    SetDimension(const SetDimension &other);

    ndsize_t index() const {
        return backend()->index();
    }

    DimensionType dimensionType() const {
        return backend()->dimensionType();
    }

    boost::optional<std::string> label() const {
        return backend()->label();
    }

    void label(const std::string &label);

    void label(const none_t t) {
        backend()->label(t);
    }

    std::vector<std::string> labels() const {
        return backend()->labels();
    }

    void labels(const std::vector<std::string> &labels) {
        backend()->labels(labels);
    }

    void labels(const boost::none_t t) {
        backend()->labels(t);
    }

    boost::optional<ndsize_t> indexOf(const double position, const PositionMatch match) const;


    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(const double start, const double end, const RangeMatch match) const;

    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(const double start, const double end, std::vector<std::string> &set_labels, const RangeMatch match) const;

    std::vector<boost::optional<std::pair<ndsize_t, ndsize_t>>> indexOf(const std::vector<double> &start_positions,
                                                                        const std::vector<double> &end_positions,
                                                                        const RangeMatch match) const;


    SetDimension& operator=(const SetDimension &other);

    SetDimension& operator=(const Dimension &other);

    SetDimension &operator=(const none_t &t) {
        ImplContainer::operator=(t);
        return *this;
    }

};


class NIXAPI RangeDimension : public base::ImplContainer<base::IRangeDimension> {

public:

    RangeDimension();

    RangeDimension(const DataArray &array);

    RangeDimension(const std::shared_ptr<base::IRangeDimension> &p_impl);

    RangeDimension(std::shared_ptr<base::IRangeDimension> &&ptr);

    RangeDimension(const RangeDimension &other);

    bool alias() const {
        return backend()->alias();
    }
    ndsize_t index() const {
        return backend()->index();
    }

    DimensionType dimensionType() const {
        return backend()->dimensionType();
    }

    boost::optional<std::string> label() const {
        return backend()->label();
    }

    void label(const std::string &label);

    void label(const none_t t) {
        backend()->label(t);
    }

    boost::optional<std::string> unit() const {
        return backend()->unit();
    }

    void unit(const std::string &unit);

    void unit(const none_t t) {
        backend()->unit(t);
    }

    std::vector<double> ticks() const {
        return backend()->ticks();
    }

    std::vector<double> ticks(ndsize_t start, size_t count) const {
        return backend()->ticks(start, count);
    }

    void ticks(const std::vector<double> &ticks);


    double tickAt(const ndsize_t index) const;


    PositionInRange positionInRange(const double position) const;


    boost::optional<ndsize_t> indexOf(const double position, PositionMatch matching) const;


    boost::optional<std::pair<ndsize_t, ndsize_t>> indexOf(double start, double end, std::vector<double> ticks,
                                                           RangeMatch match = RangeMatch::Exclusive) const;


    DEPRECATED ndsize_t indexOf(const double position, bool less_or_equal = true) const;


    DEPRECATED std::pair<ndsize_t, ndsize_t> indexOf(const double start, const double end) const;


    DEPRECATED std::vector<std::pair<ndsize_t, ndsize_t>> indexOf(const std::vector<double> &start_positions,
                                                                  const std::vector<double> &end_positions,
                                                                  bool strict, RangeMatch match = RangeMatch::Inclusive) const;


    std::vector<boost::optional<std::pair<ndsize_t, ndsize_t>>> indexOf(const std::vector<double> &start_positions,
                                                                        const std::vector<double> &end_positions,
                                                                        RangeMatch match = RangeMatch::Exclusive) const;

    std::vector<double> axis(const ndsize_t count, const ndsize_t startIndex = 0) const;

    RangeDimension& operator=(const RangeDimension &other);

    RangeDimension& operator=(const Dimension &other);

    RangeDimension &operator=(const none_t &t) {
        ImplContainer::operator=(t);
        return *this;
    }

    double operator[](const ndsize_t index) {
        return tickAt(index);
    }

};


class NIXAPI Dimension : public base::ImplContainer<base::IDimension> {

public:

    Dimension();

    Dimension(const std::shared_ptr<base::IDimension> &p_impl);

    Dimension(std::shared_ptr<base::IDimension> &&ptr);


    Dimension(const Dimension &other);

    Dimension(const SampledDimension &other);

    Dimension(const RangeDimension &other);

    Dimension(const SetDimension &other);

    Dimension(const DataFrameDimension &other);

    ndsize_t index() const {
        return backend()->index();
    }

    DimensionType dimensionType() const {
        return backend()->dimensionType();
    }

    SetDimension asSetDimension() const;

    SampledDimension asSampledDimension() const;

    RangeDimension asRangeDimension() const;

    DataFrameDimension asDataFrameDimension() const;

    Dimension& operator=(const SampledDimension &other);

    Dimension& operator=(const RangeDimension &other);

    Dimension& operator=(const SetDimension &other);

    Dimension &operator=(const DataFrameDimension &other);

    Dimension &operator=(const Dimension &other)  {
        ImplContainer::operator=(other);
        return *this;
    }

    Dimension &operator=(const none_t &t) {
        ImplContainer::operator=(t);
        return *this;
    }

};

template<>
struct objectToType<nix::SetDimension> {
    static const bool isValid = true;
    static const ObjectType value = ObjectType::SetDimension;
    typedef nix::base::ISetDimension backendType;
};


template<>
struct objectToType<nix::SampledDimension> {
    static const bool isValid = true;
    static const ObjectType value = ObjectType::SampledDimension;
    typedef nix::base::ISampledDimension backendType;
};



template<>
struct objectToType<nix::RangeDimension> {
    static const bool isValid = true;
    static const ObjectType value = ObjectType::RangeDimension;
    typedef nix::base::IRangeDimension backendType;
};

template<>
struct objectToType<nix::DataFrameDimension> {
    static const bool isValid = true;
    static const ObjectType value = ObjectType::DataFrameDimension;
    typedef nix::base::IDataFrameDimension backendType;
};

} // namespace nix

#endif // NIX_DIMENSIONS_H