argument.hpp 1.25 KB
Newer Older
Paul's avatar
Paul committed
1
2
#ifndef MIGRAPH_GUARD_MIGRAPHLIB_ARGUMENT_HPP
#define MIGRAPH_GUARD_MIGRAPHLIB_ARGUMENT_HPP
Paul's avatar
Paul committed
3

Paul's avatar
Paul committed
4
5
#include <migraph/shape.hpp>
#include <migraph/raw_data.hpp>
6
#include <migraph/config.hpp>
Paul's avatar
Paul committed
7
#include <functional>
Paul's avatar
Paul committed
8
#include <utility>
Paul's avatar
Paul committed
9

10
11
namespace migraph {
inline namespace MIGRAPH_INLINE_NS {
Paul's avatar
Paul committed
12

Paul's avatar
Paul committed
13
14
/**
 * @brief Arguments passed to instructions
Paul's avatar
Paul committed
15
16
17
18
 *
 * An `argument` can represent a raw buffer of data that either be referenced from another element
 * or it can be owned by the argument.
 *
Paul's avatar
Paul committed
19
 */
Paul's avatar
Paul committed
20
struct argument : raw_data<argument>
Paul's avatar
Paul committed
21
{
Paul's avatar
Paul committed
22
    argument() {}
Paul's avatar
Paul committed
23

Paul's avatar
Paul committed
24
    argument(const shape& s) : m_shape(s)
Paul's avatar
Paul committed
25
26
27
28
29
    {
        std::vector<char> buffer(s.bytes());
        // TODO: Move vector
        data = [=]() mutable { return buffer.data(); };
    }
Paul's avatar
Paul committed
30

Paul's avatar
Paul committed
31
    argument(shape s, std::function<char*()> d) : data(std::move(d)), m_shape(std::move(s)) {}
Paul's avatar
Paul committed
32
    template <class T>
Paul's avatar
Paul committed
33
34
    argument(shape s, T* d)
        : data([d] { return reinterpret_cast<char*>(d); }), m_shape(std::move(s))
Paul's avatar
Paul committed
35
36
    {
    }
Paul's avatar
Paul committed
37

Paul's avatar
Paul committed
38
    /// Provides a raw pointer to the data
Paul's avatar
Paul committed
39
    std::function<char*()> data;
Paul's avatar
Paul committed
40

Paul's avatar
Paul committed
41
    /// Whether data is available
Paul's avatar
Paul committed
42
    bool empty() const { return not data; }
Paul's avatar
Paul committed
43

Paul's avatar
Paul committed
44
    const shape& get_shape() const { return this->m_shape; }
Paul's avatar
Paul committed
45
46

    private:
Paul's avatar
Paul committed
47
    shape m_shape;
Paul's avatar
Paul committed
48
49
};

Shucai Xiao's avatar
Shucai Xiao committed
50
} // namespace MIGRAPH_INLINE_NS
Paul's avatar
Paul committed
51
} // namespace migraph
Paul's avatar
Paul committed
52
53

#endif