20 #include <boost/algorithm/string/replace.hpp>
21 #include <type_traits>
29 template <
typename Range,
typename StorageType>
31 auto c =
static_cast<const StorageType*
>( obj );
32 if ( !
c )
return Range();
36 auto last =
end( *
c );
37 auto _first =
reinterpret_cast<typename Range::const_iterator*
>( &first );
38 auto _last =
reinterpret_cast<typename Range::const_iterator*
>( &last );
39 return Range( *_first, *_last );
42 template <
typename ValueType,
typename Range = Gaudi::Range_<
typename ValueType::ConstVector>>
44 using Selection =
typename ValueType::Selection;
45 auto sel =
dynamic_cast<const Selection*
>( obj );
46 if (
sel )
return &make_range<Range, typename ValueType::Selection>;
47 auto con =
dynamic_cast<std::add_const_t<typename ValueType::Container>*
>( obj );
48 if ( con )
return &make_range<Range, typename ValueType::Container>;
54 using Type = std::add_const_t<T>;
55 assert( dataObj !=
nullptr );
56 auto obj =
dynamic_cast<Type*
>( dataObj );
62 " and is different from the one of the object in the store which is " +
66 assert( obj ==
static_cast<Type*
>( dataObj ) );
70 template <Gaudi::DataHandle::Mode,
typename T,
typename U>
73 std::conditional_t<std::is_base_of_v<DataObject, T> && std::is_same_v<T, U>, T,
77 template <
typename T,
typename U>
81 template <
typename T,
typename U>
85 template <
typename T,
typename U>
87 using type = std::optional<Gaudi::NamedRange_<T>>;
90 template <Gaudi::DataHandle::Mode mode,
typename T,
typename U = T>
109 template <
typename T>
128 bool exist()
const {
return get(
false ) !=
nullptr; }
138 T*
put( std::unique_ptr<T>
object )
const;
147 T*
get(
bool mustExist )
const;
160 template <
typename T>
162 auto dataObj =
fetch();
165 throw GaudiException(
"Cannot retrieve \'" + objKey() +
"\' from transient store.",
170 if ( !m_goodType ) m_goodType = ::details::verifyType<T>( dataObj );
171 return static_cast<T*
>( dataObj );
175 template <
typename T>
178 StatusCode sc = m_EDS->registerObject( objKey(), objectp.get() );
179 if ( !sc.
isSuccess() ) {
throw GaudiException(
"Error in put of " + objKey(),
"DataObjectHandle<T>::put", sc ); }
180 return objectp.release();
184 template <
typename T>
186 T* obj =
get(
false );
187 return obj ? obj :
put( std::make_unique<T>() );
193 template <
typename T>
196 using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
213 mutable ::details::Converter_t<Range> m_converter =
nullptr;
216 template <
typename ValueType>
218 auto dataObj =
fetch();
220 throw GaudiException(
"Cannot retrieve \'" + objKey() +
"\' from transient store.",
223 if ( !m_converter ) {
224 m_converter = ::details::select_range_converter<ValueType>( dataObj );
225 if ( !m_converter ) {
227 ")" +
" cannot be obtained from object in event store" +
" (" +
232 return ( *m_converter )( dataObj );
238 template <
typename T>
241 using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
258 mutable ::details::Converter_t<Range> m_converter =
nullptr;
261 template <
typename ValueType>
263 auto dataObj =
fetch();
265 throw GaudiException(
"Cannot retrieve \'" + objKey() +
"\' from transient store.",
268 if ( !m_converter ) {
269 m_converter = ::details::select_range_converter<ValueType, Range>( dataObj );
270 if ( !m_converter ) {
272 ")" +
" cannot be obtained from object in event store" +
" (" +
277 return ( *m_converter )( dataObj );
284 template <
typename T>
287 using ValueType = std::remove_cv_t<std::remove_pointer_t<typename T::value_type>>;
295 std::optional<Range>
get()
const;
304 mutable ::details::Converter_t<Range> m_converter =
nullptr;
307 template <
typename ValueType>
309 auto dataObj =
fetch();
310 if ( !dataObj )
return std::nullopt;
311 if ( !m_converter ) {
312 m_converter = ::details::select_range_converter<ValueType, Range>( dataObj );
313 if ( !m_converter ) {
315 ")" +
" cannot be obtained from object in event store" +
" (" +
320 return ( *m_converter )( dataObj );
325 template <
typename T>
333 T*
get()
const {
return &_get(
true )->getData(); }
335 auto data = _get(
false );
336 return data ? &data->getData() :
nullptr;
342 const T*
put( T&& obj )
const {
344 auto objectp = std::make_unique<AnyDataWrapper<T>>( std::move( obj ) );
345 if (
auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
346 throw GaudiException(
"Error in put of " + objKey(),
"DataObjectHandle<AnyDataWrapper<T>>::put", sc );
348 return &objectp.release()->getData();
354 std::optional<std::size_t>
size()
const {
return _get()->size(); }
367 throw GaudiException(
"Cannot retrieve \'" + objKey() +
"\' from transient store.",
382 template <
typename View,
typename Owned>
390 View*
get()
const {
return &_get(
true )->getData(); }
392 auto data = _get(
false );
393 return data ? &data->getData() :
nullptr;
401 if (
auto sc = m_EDS->registerObject( objKey(), objectp.get() ); sc.isFailure() ) {
402 throw GaudiException(
"Error in put of " + objKey(),
"DataObjectHandle<AnyDataWithViewWrapper<T>::put", sc );
404 return &objectp.release()->getData();
406 const View*
put( Owned&& obj )
const {
413 std::optional<std::size_t>
size()
const {
return _get()->size(); }
426 throw GaudiException(
"Cannot retrieve \'" + objKey() +
"\' from transient store.",
433 if ( !
m_goodType )
m_goodType = ::details::verifyType<AnyDataWithViewWrapper<View, Owned>>( obj );
441 template <
typename T,
typename U = T>
443 template <
typename T,
typename U = T>
447 template <
typename T>
449 template <
typename... Args, std::size_t... Is>
459 template <std::derived_from<IProperty> OWNER,
typename K>
462 std::move( doc ) ) {}
464 template <
typename... Args>
469 template <
typename T,
typename U = T>
471 template <
typename... Args, std::size_t... Is>
481 template <std::derived_from<IProperty> OWNER,
typename K>
484 std::move( doc ) ) {}
486 template <
typename... Args>