ComputeFHE 1.0
General-Purpose Privacy-Preserving Computation Library for TFHE
Loading...
Searching...
No Matches
Evector.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 Faris Serdar Taşel <fst@cankaya.edu.tr>
3 * SPDX-FileCopyrightText: 2026 Efe Çiftci <efeciftci@cankaya.edu.tr>
4 *
5 * SPDX-License-Identifier: MIT
6 */
7
14#pragma once
16#include <type_traits>
17#include <vector>
18
19namespace computefhe {
20
30 template <typename T> class Evector;
31
45 template <typename T, typename U> class Eitem {
46 protected:
49 size_t p_index;
51
52 public:
54 Eitem(Evector<T> &vec, const Einteger &idx);
56 Eitem(Evector<T> &vec, const size_t idx);
57
59 operator T() const;
60
63 template <typename V,
64 typename = std::enable_if_t<std::is_constructible_v<V, T> &&
65 !std::is_same_v<V, T>>>
66 operator V() const {
67 return V(operator T());
68 }
69
72 const T &operator=(const T &value);
73
76 const T &operator=(U value);
77
80 T operator+(const T &b) const;
81 T operator+(U b) const;
82 T operator-(const T &b) const;
83 T operator-(U b) const;
84 T operator*(const T &b) const;
85 T operator*(U b) const;
86 T operator/(const T &b) const;
87 T operator/(U b) const;
88 T operator%(const T &b) const;
89 T operator%(U b) const;
91
94 T operator&(const T &b) const;
95 T operator&(U b) const;
96 T operator|(const T &b) const;
97 T operator|(U b) const;
98 T operator^(const T &b) const;
99 T operator^(U b) const;
101
104 Einteger operator==(const T &b) const;
105 Einteger operator==(U b) const;
106 Einteger operator!=(const T &b) const;
107 Einteger operator!=(U b) const;
108 Einteger operator>(const T &b) const;
109 Einteger operator>(U b) const;
110 Einteger operator>=(const T &b) const;
111 Einteger operator>=(U b) const;
112 Einteger operator<(const T &b) const;
113 Einteger operator<(U b) const;
114 Einteger operator<=(const T &b) const;
115 Einteger operator<=(U b) const;
117
120 T operator&&(const T &b) const;
121 T operator&&(U b) const;
122 T operator||(const T &b) const;
123 T operator||(U b) const;
125
128 T operator<<(int b) const;
129 T operator>>(int b) const;
131
134 Eitem<T, U> &operator+=(const T &b);
135 Eitem<T, U> &operator+=(U b);
136 Eitem<T, U> &operator-=(const T &b);
137 Eitem<T, U> &operator-=(U b);
138 Eitem<T, U> &operator*=(const T &b);
139 Eitem<T, U> &operator*=(U b);
140 Eitem<T, U> &operator/=(const T &b);
141 Eitem<T, U> &operator/=(U b);
142 Eitem<T, U> &operator%=(const T &b);
143 Eitem<T, U> &operator%=(U b);
144 Eitem<T, U> &operator&=(const T &b);
145 Eitem<T, U> &operator&=(U b);
146 Eitem<T, U> &operator|=(const T &b);
147 Eitem<T, U> &operator|=(U b);
148 Eitem<T, U> &operator^=(const T &b);
149 Eitem<T, U> &operator^=(U b);
150 Eitem<T, U> &operator<<=(int b);
151 Eitem<T, U> &operator>>=(int b);
153
156 T operator!() const;
157 T operator~() const;
158 T operator-() const;
159 T operator++();
160 T operator++(int);
161 T operator--();
162 T operator--(int);
164
167 friend std::ostream &operator<<(std::ostream &out,
168 const Eitem<T, U> &item) {
169 return out << static_cast<T>(item);
170 }
171 };
172
176 template <typename T> class Evector : public std::vector<T> {
177 public:
178 using std::vector<T>::vector;
179 using std::vector<T>::operator[];
180
188 reinterpret_cast<Evector<Einteger> &>(*this), index);
189 // TODO: Use below in client-mode only
191 reinterpret_cast<Evector<Einteger> &>(*this), (size_t)index);
192 }
193
198 template <typename Integral,
199 typename = std::enable_if_t<std::is_integral_v<Integral>>>
201 return this->at(static_cast<size_t>(idx));
202 }
203 };
204
208 template <> class Evector<Einteger> : public std::vector<Einteger> {
209 public:
210 using std::vector<Einteger>::vector;
211 using std::vector<Einteger>::operator[];
212
218 return Eitem<Einteger, uint64_t>(*this, index);
219 // TODO: Use below in client-mode only
220 return Eitem<Einteger, uint64_t>(*this, (size_t)index);
221 }
222
224 template <typename Integral,
225 typename = std::enable_if_t<std::is_integral_v<Integral>>>
227 return this->at(static_cast<size_t>(idx));
228 }
229 };
230
234 template <> class Evector<Efixedpoint> : public std::vector<Efixedpoint> {
235 public:
236 using std::vector<Efixedpoint>::vector;
237 using std::vector<Efixedpoint>::operator[];
238
244 return Eitem<Efixedpoint, double>(*this, index);
245 // TODO: Use below in client-mode only
246 return Eitem<Efixedpoint, double>(*this, (size_t)index);
247 }
248
250 template <typename Integral,
251 typename = std::enable_if_t<std::is_integral_v<Integral>>>
253 return this->at(static_cast<size_t>(idx));
254 }
255 };
256
260 template <size_t N, size_t F, bool S>
261 class Evector<EFix<N, F, S>> : public std::vector<EFix<N, F, S>> {
262 public:
263 using std::vector<EFix<N, F, S>>::vector;
264 using std::vector<EFix<N, F, S>>::operator[];
265
272 reinterpret_cast<Evector<Efixedpoint> &>(*this), index);
273 // TODO: Use below in client-mode only
275 reinterpret_cast<Evector<Efixedpoint> &>(*this), (size_t)index);
276 }
277
279 template <typename Integral,
280 typename = std::enable_if_t<std::is_integral_v<Integral>>>
282 return this->at(static_cast<size_t>(idx));
283 }
284 };
285} // namespace computefhe
Defines the encrypted fixed-point number representation and operations.
Template class for fixed-precision encrypted real numbers.
Definition Efixedpoint.h:336
Represents an encrypted fixed-point number.
Definition Efixedpoint.h:27
Represents an encrypted integer.
Definition Einteger.h:27
Proxy object for accessing and modifying elements in an Evector using encrypted indices.
Definition Evector.h:45
bool encrypted_index
Flag indicating if the index is encrypted.
Definition Evector.h:50
FixedPoint index
The encrypted index value.
Definition Evector.h:48
friend std::ostream & operator<<(std::ostream &out, const Eitem< T, U > &item)
Stream insertion operator to handle direct printing of proxy items.
Definition Evector.h:167
size_t p_index
Plaintext index (used if encrypted_index is false).
Definition Evector.h:49
const T & operator=(U value)
Assignment operator from a plaintext value: converts to T using vector element metadata and then upda...
Eitem(Evector< T > &vec, const size_t idx)
Constructs a proxy item using a plaintext index.
const T & operator=(const T &value)
Assignment operator: conditionally updates vector elements based on the index.
Evector< T > & data
Reference to the parent vector.
Definition Evector.h:47
Eitem(Evector< T > &vec, const Einteger &idx)
Constructs a proxy item using an encrypted index.
EFix< N, F, S > & operator[](Integral idx)
Access element using a plaintext index.
Definition Evector.h:281
Eitem< Efixedpoint, double > operator[](const Einteger &index)
Access element using an encrypted index.
Definition Evector.h:270
Eitem< Efixedpoint, double > operator[](const Einteger &index)
Access element using an encrypted index.
Definition Evector.h:243
Efixedpoint & operator[](Integral idx)
Access element using a plaintext index.
Definition Evector.h:252
Eitem< Einteger, uint64_t > operator[](const Einteger &index)
Access element using an encrypted index.
Definition Evector.h:217
Einteger & operator[](Integral idx)
Access element using a plaintext index.
Definition Evector.h:226
General template for Evector.
Definition Evector.h:176
T & operator[](Integral idx)
Access element using a plaintext integral index. Overloads standard std::vector access to return a di...
Definition Evector.h:200
Eitem< Einteger, uint64_t > operator[](const Einteger &index)
Access element using an encrypted index.
Definition Evector.h:186
A bit-vector representation of an encrypted or plaintext word.
Definition FixedPoint.h:118