Skip to content

Commit 7724e3c

Browse files
author
Pavel Siska
committed
fieldManager
1 parent 3e777f5 commit 7724e3c

File tree

2 files changed

+259
-0
lines changed

2 files changed

+259
-0
lines changed

new-process-api/fieldManager.cpp

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/**
2+
* @file
3+
* @author Pavel Siska <[email protected]>
4+
* @brief Implementation of FieldManager methods for registering and accessing fields.
5+
*
6+
* @copyright Copyright (c) 2025 CESNET, z.s.p.o.
7+
*/
8+
9+
#include "fieldManager.hpp"
10+
#include "fieldSchema.hpp"
11+
12+
namespace ipxp {
13+
14+
static FieldInfo makeFieldInfo(
15+
std::string_view group,
16+
std::string_view name,
17+
std::size_t bitIndex,
18+
GenericValueGetter getter)
19+
{
20+
return {
21+
.group = std::string(group),
22+
.name = std::string(name),
23+
.bitIndex = bitIndex,
24+
.getter = std::move(getter),
25+
};
26+
}
27+
28+
[[nodiscard]] FieldSchema FieldManager::createFieldSchema(std::string_view groupName)
29+
{
30+
return FieldSchema(groupName, *this);
31+
}
32+
33+
const std::vector<FieldDescriptor>& FieldManager::getBiflowFields() const
34+
{
35+
return m_biflowFields;
36+
}
37+
38+
const std::vector<FieldDescriptor>& FieldManager::getReverseBiflowFields() const
39+
{
40+
return m_reverseBiflowFields;
41+
}
42+
43+
const std::vector<FieldDescriptor>& FieldManager::getUniflowForwardFields() const
44+
{
45+
return m_uniflowForwardFields;
46+
}
47+
48+
const std::vector<FieldDescriptor>& FieldManager::getUniflowReverseFields() const
49+
{
50+
return m_uniflowReverseFields;
51+
}
52+
53+
[[nodiscard]] FieldHandler FieldManager::registerField(
54+
std::string_view groupName,
55+
std::string_view fieldName,
56+
GenericValueGetter getter)
57+
{
58+
const auto bitIndex = getNextBitIndex();
59+
const FieldHandler fieldHandler(bitIndex);
60+
61+
const FieldInfo fieldInfo = makeFieldInfo(groupName, fieldName, bitIndex, getter);
62+
63+
m_biflowFields.emplace_back(FieldDescriptor(fieldInfo));
64+
m_reverseBiflowFields.emplace_back(FieldDescriptor(fieldInfo));
65+
m_uniflowForwardFields.emplace_back(FieldDescriptor(fieldInfo));
66+
m_uniflowReverseFields.emplace_back(FieldDescriptor(fieldInfo));
67+
68+
return fieldHandler;
69+
}
70+
71+
[[nodiscard]] std::pair<FieldHandler, FieldHandler> FieldManager::registerDirectionalPairFields(
72+
std::string_view groupName,
73+
std::string_view forwardFieldName,
74+
std::string_view reverseFieldName,
75+
GenericValueGetter forwardGetter,
76+
GenericValueGetter reverseGetter)
77+
{
78+
const auto forwardBitIndex = getNextBitIndex();
79+
const auto reverseBitIndex = getNextBitIndex();
80+
81+
const FieldHandler forwardFieldHandler(forwardBitIndex);
82+
const FieldHandler reverseFieldHandler(reverseBitIndex);
83+
84+
const FieldInfo forwardFieldInfoInBiflow
85+
= makeFieldInfo(groupName, forwardFieldName, forwardBitIndex, forwardGetter);
86+
87+
const FieldInfo reverseFieldInfoInBiflow
88+
= makeFieldInfo(groupName, reverseFieldName, reverseBitIndex, reverseGetter);
89+
90+
m_biflowFields.emplace_back(FieldDescriptor(forwardFieldInfoInBiflow));
91+
m_biflowFields.emplace_back(FieldDescriptor(reverseFieldInfoInBiflow));
92+
93+
const FieldInfo forwardFieldInfoInReverseBiflow
94+
= makeFieldInfo(groupName, forwardFieldName, reverseBitIndex, forwardGetter);
95+
96+
const FieldInfo reverseFieldInfoInReverseBiflow
97+
= makeFieldInfo(groupName, reverseFieldName, forwardBitIndex, reverseGetter);
98+
99+
m_reverseBiflowFields.emplace_back(FieldDescriptor(forwardFieldInfoInReverseBiflow));
100+
m_reverseBiflowFields.emplace_back(FieldDescriptor(reverseFieldInfoInReverseBiflow));
101+
102+
const FieldInfo forwardFieldInUniflow
103+
= makeFieldInfo(groupName, forwardFieldName, forwardBitIndex, forwardGetter);
104+
105+
const FieldInfo reverseFieldInUniflow
106+
= makeFieldInfo(groupName, forwardFieldName, reverseBitIndex, reverseGetter);
107+
108+
m_uniflowForwardFields.emplace_back(FieldDescriptor(forwardFieldInUniflow));
109+
m_uniflowReverseFields.emplace_back(FieldDescriptor(reverseFieldInUniflow));
110+
111+
return {forwardFieldHandler, reverseFieldHandler};
112+
}
113+
114+
[[nodiscard]] std::pair<FieldHandler, FieldHandler> FieldManager::registerBiflowPairFields(
115+
std::string_view groupName,
116+
std::string_view aFieldName,
117+
std::string_view bFieldName,
118+
GenericValueGetter aGetter,
119+
GenericValueGetter bGetter)
120+
{
121+
const std::size_t aBitIndex = getNextBitIndex();
122+
const std::size_t bBitIndex = getNextBitIndex();
123+
124+
const FieldHandler aFieldHandler(aBitIndex);
125+
const FieldHandler bFieldHandler(bBitIndex);
126+
127+
const FieldInfo aFieldInfoInBiflow = makeFieldInfo(groupName, aFieldName, aBitIndex, aGetter);
128+
129+
const FieldInfo bFieldInfoInBiflow = makeFieldInfo(groupName, bFieldName, bBitIndex, bGetter);
130+
131+
m_biflowFields.emplace_back(FieldDescriptor(aFieldInfoInBiflow));
132+
m_biflowFields.emplace_back(FieldDescriptor(bFieldInfoInBiflow));
133+
134+
const FieldInfo aFieldInfoInReverseBiflow
135+
= makeFieldInfo(groupName, aFieldName, bBitIndex, aGetter);
136+
137+
const FieldInfo bFieldInfoInReverseBiflow
138+
= makeFieldInfo(groupName, bFieldName, aBitIndex, bGetter);
139+
140+
m_reverseBiflowFields.emplace_back(FieldDescriptor(aFieldInfoInReverseBiflow));
141+
m_reverseBiflowFields.emplace_back(FieldDescriptor(bFieldInfoInReverseBiflow));
142+
143+
const FieldInfo aFieldInForwardUniflow
144+
= makeFieldInfo(groupName, aFieldName, aBitIndex, aGetter);
145+
146+
const FieldInfo bFieldInForwardUniflow
147+
= makeFieldInfo(groupName, bFieldName, bBitIndex, bGetter);
148+
149+
m_uniflowForwardFields.emplace_back(FieldDescriptor(aFieldInForwardUniflow));
150+
m_uniflowForwardFields.emplace_back(FieldDescriptor(bFieldInForwardUniflow));
151+
152+
const FieldInfo aFieldInReverseUniflow
153+
= makeFieldInfo(groupName, aFieldName, bBitIndex, aGetter);
154+
155+
const FieldInfo bFieldInReverseUniflow
156+
= makeFieldInfo(groupName, bFieldName, aBitIndex, bGetter);
157+
158+
m_uniflowReverseFields.emplace_back(FieldDescriptor(aFieldInReverseUniflow));
159+
m_uniflowReverseFields.emplace_back(FieldDescriptor(bFieldInReverseUniflow));
160+
161+
return {aFieldHandler, bFieldHandler};
162+
}
163+
164+
} // namespace ipxp

new-process-api/fieldManager.hpp

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* @file
3+
* @author Pavel Siska <[email protected]>
4+
* @brief FieldManager manages registration and organization of FlowRecord fields.
5+
*
6+
* FieldManager is responsible for:
7+
* - Creating FieldSchema instances for different logical groups
8+
* - Registering scalar and directional fields
9+
* - Keeping track of biflow and uniflow fields
10+
* - Providing access to field descriptors for introspection and validation
11+
*
12+
* It maintains internal bit indices for each field to efficiently check
13+
* presence in FlowRecord instances.
14+
*
15+
* @copyright Copyright (c) 2025 CESNET, z.s.p.o.
16+
*/
17+
18+
#pragma once
19+
20+
#include "fieldDescriptor.hpp"
21+
#include "fieldGenericValueGetter.hpp"
22+
#include "fieldHandler.hpp"
23+
24+
#include <atomic>
25+
#include <cstdint>
26+
#include <string_view>
27+
#include <utility>
28+
#include <vector>
29+
30+
namespace ipxp {
31+
32+
class FieldSchema;
33+
34+
/**
35+
* @class FieldManager
36+
* @brief Central registry for FlowRecord fields and their metadata.
37+
*
38+
* Provides methods to register fields, directional field pairs, and biflow pairs.
39+
* Offers access to field descriptors grouped by biflow/uniflow and direction.
40+
*/
41+
class FieldManager {
42+
public:
43+
/**
44+
* @brief Creates a FieldSchema for a given group name.
45+
* @param groupName Logical group name (e.g., "dns", "http").
46+
* @return Newly created FieldSchema instance.
47+
*/
48+
[[nodiscard]] FieldSchema createFieldSchema(std::string_view groupName);
49+
50+
/** @brief Returns all biflow fields. */
51+
const std::vector<FieldDescriptor>& getBiflowFields() const;
52+
53+
/** @brief Returns reverse biflow fields. */
54+
const std::vector<FieldDescriptor>& getReverseBiflowFields() const;
55+
56+
/** @brief Returns uniflow forward fields. */
57+
const std::vector<FieldDescriptor>& getUniflowForwardFields() const;
58+
59+
/** @brief Returns uniflow reverse fields. */
60+
const std::vector<FieldDescriptor>& getUniflowReverseFields() const;
61+
62+
private:
63+
// registration of field can only be done by FieldSchema
64+
friend class FieldSchema;
65+
66+
[[nodiscard]] FieldHandler registerField(
67+
std::string_view groupName,
68+
std::string_view fieldName,
69+
GenericValueGetter getter);
70+
71+
[[nodiscard]] std::pair<FieldHandler, FieldHandler> registerDirectionalPairFields(
72+
std::string_view groupName,
73+
std::string_view forwardFieldName,
74+
std::string_view reverseFieldName,
75+
GenericValueGetter forwardGetter,
76+
GenericValueGetter reverseGetter);
77+
78+
[[nodiscard]] std::pair<FieldHandler, FieldHandler> registerBiflowPairFields(
79+
std::string_view groupName,
80+
std::string_view aFieldName,
81+
std::string_view bFieldName,
82+
GenericValueGetter aGetter,
83+
GenericValueGetter bGetter);
84+
85+
[[nodiscard]] std::size_t getNextBitIndex() noexcept { return m_fieldIndex++; }
86+
87+
std::vector<FieldDescriptor> m_biflowFields;
88+
std::vector<FieldDescriptor> m_reverseBiflowFields;
89+
std::vector<FieldDescriptor> m_uniflowForwardFields;
90+
std::vector<FieldDescriptor> m_uniflowReverseFields;
91+
92+
std::atomic<std::size_t> m_fieldIndex = 0;
93+
};
94+
95+
} // namespace ipxp

0 commit comments

Comments
 (0)