msl 1.1.0
 
Loading...
Searching...
No Matches
Block.h
Go to the documentation of this file.
1// Copyright 2024-2025 Julien Lamy, ICube, Université de Strasbourg-CNRS.
2// Part of msl, distributed under the terms of the MIT license.
3
4#ifndef _27135a4d_ad34_43b2_b032_c9745dc65fca
5#define _27135a4d_ad34_43b2_b032_c9745dc65fca
6
7#include <numeric>
8#include <string>
9
10#include <MrImagingFW/libSeqUtilFW/libSeqUtilFW.h>
11
12#include <MrMeasSrv/MeasUtils/NLSStatus.h>
13#include <MrMeasSrv/SeqIF/libRT/sSLICE_POS.h>
14#include <MrMeasSrv/SeqIF/Sequence/sequmsg.h>
15
16#include <MrProtSrv/Domain/CoreNative/SeqLim.h>
17#include <MrProtSrv/Domain/MrProtData/MrProt/MrProt.h>
18#include <MrProtSrv/Domain/MrProtData/MrProt/SeqIF/SeqExpo.h>
19#include <MrProtSrv/Domain/MrProtData/MrProt/SeqIF/SeqExpoRFBlockInfo.h>
20
21#include "msl/Counter.h"
23#include "msl/helpers.h"
24#include "msl/Iterator.h"
25
26namespace msl
27{
28namespace graph
29{
30
46template<typename T, typename Slices=std::vector<sSLICE_POS>>
47class Block: public AbstractNode
48{
49public:
50 using Pointer = std::shared_ptr<Block<T, Slices>>;
51 using ConstPointer = std::shared_ptr<Block<T const, Slices>>;
52
54
55 template<typename ... Args>
56 static Pointer New(std::string const & slice, Args && ... args)
57 {
58 return Pointer(new Block<T>(slice, args ...));
59 }
60
61 virtual ~Block() = default;
62
64 NLSStatus prepare(
65 MrProt & protocol, SeqLim & limits, SeqExpo & exports) override
66 {
67 ON_FALSE_RETURN_STATUS(this->block, prep(protocol, limits, exports));
68 return MRI_SEQ_SEQU_NORMAL;
69 }
70
72 NLSStatus run(
73 MrProt & protocol, SeqLim & limits, SeqExpo & exports) override
74 {
75 auto slice = this->get<msl::ConstIterator<Slices>>(this->_slice).item();
77 this->block, run(protocol, limits, exports, &slice));
78 return MRI_SEQ_SEQU_NORMAL;
79 }
80
82 uint64_t duration() const override
83 {
84 // WARNING: SeqBuildBlock::getDurationPerRequest is not const.
85 return const_cast<T&>(this->block).getDurationPerRequest();
86 }
87
89 MrProtocolData::SeqExpoRFInfo rfInfo() const override
90 {
91 // WARNING: SeqBuildBlock::getDurationPerRequest is not const.
92 return const_cast<T&>(this->block).getRFInfoPerRequest();
93 }
94
95private:
96 std::string _slice;
97
98 template<typename ... Args>
99 Block(std::string const & slice, Args && ... args)
100 : AbstractNode(), block(args ...), _slice(slice)
101 {
102 // Nothing else.
103 }
104 Block(Block<T, Slices> const &) = default;
105 Block(Block<T, Slices> &&) = default;
106 Block & operator=(Block<T, Slices> const &) = default;
107 Block & operator=(Block<T, Slices> &&) = default;
108};
109
110}
111}
112
113#endif // _27135a4d_ad34_43b2_b032_c9745dc65fca
Base class for all graph nodes.
Definition AbstractNode.h:27
T const & get(std::string const &key) const
Return an object from the dictionary.
Definition AbstractNode.h:64
AbstractNode(Dictionary::Pointer registry={})
Node encapsulating a block (anything respecting the API of SeqBuildBlock).
Definition Block.h:48
virtual ~Block()=default
T block
Definition Block.h:53
NLSStatus prepare(MrProt &protocol, SeqLim &limits, SeqExpo &exports) override
Prepare the block.
Definition Block.h:64
uint64_t duration() const override
Return the duration of the block.
Definition Block.h:82
MrProtocolData::SeqExpoRFInfo rfInfo() const override
Return the RF information of the block.
Definition Block.h:89
NLSStatus run(MrProt &protocol, SeqLim &limits, SeqExpo &exports) override
Run the block with the slice referenced by the counter.
Definition Block.h:72
std::shared_ptr< Block< T, Slices > > Pointer
Definition Block.h:50
std::shared_ptr< Block< T const, Slices > > ConstPointer
Definition Block.h:51
static Pointer New(std::string const &slice, Args &&... args)
Definition Block.h:56
#define ON_FALSE_RETURN_STATUS(O, S)
Execute statement O.S, and, if false, return the status of object O.
Definition helpers.h:52
Definition AbstractNode.h:23
Definition acceleration.h:17