574 using TraitsType = TRAITS;
579 using TimeStampType =
typename TRAITS::TimeStampType;
584 using TimeStampDifferenceType =
typename TRAITS::TimeStampDifferenceType;
593 static constexpr bool kTrackExpiration = TRAITS::kTrackExpiration;
602 static constexpr bool kTrackFreshness = TRAITS::kTrackFreshness;
611 requires (not is_empty_v<
decltype (TRAITS::kDefaultMaxAge)>);
612 explicit TimedCache (TimeStampDifferenceType maxAge)
613 requires (TRAITS::kPerCacheMaxAge);
623 constexpr TimeStampDifferenceType GetMaxAge_ ()
const;
640 nonvirtual TimeStampDifferenceType GetMaxAge ()
const;
646 nonvirtual
void SetMaxAge (TimeStampDifferenceType maxAge)
647 requires (TRAITS::kPerCacheMaxAge);
674 template <
typename K = KEY>
676 requires (IKeyedCache<K>);
699 template <typename K = KEY>
700 requires (IKeyedCache<K>)
701 nonvirtual optional<VALUE> Lookup (typename Common::ArgByValueType<K> key) const;
702 template <typename K = KEY>
703 requires (IKeyedCache<K>)
704 nonvirtual optional<VALUE> Lookup (typename Common::ArgByValueType<K> key);
705 template <typename K = KEY>
706 requires (IKeyedCache<K> and TRAITS::kTrackFreshness)
707 nonvirtual optional<VALUE> Lookup (typename Common::ArgByValueType<K> key, TimeStampDifferenceType maxAge) const;
708 template <typename K = KEY>
709 requires (not IKeyedCache<K>)
710 nonvirtual optional<VALUE> Lookup () const;
711 template <typename K = KEY>
712 requires (not IKeyedCache<K>)
713 nonvirtual optional<VALUE> Lookup ();
714 template <typename K = KEY>
715 requires (not IKeyedCache<K> and TRAITS::kTrackFreshness)
716 nonvirtual optional<VALUE> Lookup (TimeStampDifferenceType maxAge) const;
717 template <typename K = KEY, typename V = VALUE>
718 requires (IKeyedCache<K> and IValuelessCache<V>)
719 nonvirtual optional<KEY> Lookup (typename Common::ArgByValueType<K> key) const;
733 template <typename K = KEY>
734 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key) const
735 requires (kTrackExpiration and IKeyedCache<K>);
736 template <typename K = KEY>
737 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key)
738 requires (kTrackExpiration and IKeyedCache<K>);
739 template <typename K = KEY>
740 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key) const
741 requires (kTrackFreshness and IKeyedCache<K>);
742 template <typename K = KEY>
743 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key)
744 requires (kTrackFreshness and IKeyedCache<K>);
745 template <typename K = KEY>
746 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key, TimeStampDifferenceType maxAge) const
747 requires (kTrackFreshness and IKeyedCache<K>);
748 template <typename K = KEY>
749 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (TimeStampDifferenceType maxAge) const
750 requires (not IKeyedCache<K>);
751 template <typename K = KEY, typename V = VALUE>
752 requires (IKeyedCache<K> and IValuelessCache<V>)
753 nonvirtual optional<tuple<KEY, TimeStampType>> LookupDetails (typename Common::ArgByValueType<K> key) const;
762 template <typename K = KEY>
763 nonvirtual optional<TimeStampType> GetExpiration () const
764 requires (not IKeyedCache<K>);
765 template <typename K = KEY>
766 nonvirtual optional<TimeStampType> GetExpiration (typename Common::ArgByValueType<K> key) const
767 requires (IKeyedCache<K>);
794 template <typename K = KEY, Common::invocable_r<VALUE, KEY> CACHE_FILLTER_T>
795 requires (IKeyedCache<K>)
796 nonvirtual VALUE LookupValue (typename Common::ArgByValueType<K> key, CACHE_FILLTER_T&& cacheFiller);
797 template <typename K = KEY, Common::invocable_r<VALUE, KEY> CACHE_FILLTER_T>
798 requires (IKeyedCache<K> and TRAITS::kTrackFreshness)
799 nonvirtual VALUE LookupValue (typename Common::ArgByValueType<K> key, TimeStampDifferenceType maxAge, CACHE_FILLTER_T&& cacheFiller);
800 template <typename K = KEY, Common::invocable_r<VALUE> CACHE_FILLTER_T>
801 requires (not IKeyedCache<K>)
802 nonvirtual VALUE LookupValue (CACHE_FILLTER_T&& cacheFiller);
803 template <typename K = KEY, Common::invocable_r<VALUE> CACHE_FILLTER_T>
804 requires (not IKeyedCache<K> and TRAITS::kTrackFreshness)
805 nonvirtual VALUE LookupValue (TimeStampDifferenceType maxAge, CACHE_FILLTER_T&& cacheFiller);
806 template <typename K = KEY, typename V = VALUE, Common::invocable_r<K, K> CACHE_FILLTER_T>
807 requires (IKeyedCache<K> and IValuelessCache<V>)
808 nonvirtual KEY LookupValue (typename Common::ArgByValueType<K> key, CACHE_FILLTER_T&& cacheFiller);
822 template <typename K = KEY>
823 requires (IKeyedCache<K> and IValuelessCache<VALUE>)
824 nonvirtual
void Add (typename Common::ArgByValueType<K> key);
825 template <typename K = KEY, typename V = VALUE>
826 requires (IKeyedCache<K> and not IValuelessCache<V>)
827 nonvirtual
void Add (typename Common::ArgByValueType<K> key, typename Common::ArgByValueType<V> result);
828 template <typename K = KEY, typename V = VALUE>
829 requires (IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackExpiration)
830 nonvirtual
void Add (typename Common::ArgByValueType<K> key, typename Common::ArgByValueType<V> result, TimeStampType expiresAt);
831 template <typename K = KEY, typename V = VALUE>
832 requires (IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackFreshness)
833 nonvirtual
void Add (typename Common::ArgByValueType<K> key, typename Common::ArgByValueType<V> result, TimeStampType freshAsOf);
834 template <typename K = KEY, typename V = VALUE>
835 requires (not IKeyedCache<K> and not IValuelessCache<V>)
836 nonvirtual
void Add (typename Common::ArgByValueType<V> result);
837 template <typename K = KEY, typename V = VALUE>
838 requires (not IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackFreshness)
839 nonvirtual
void Add (typename Common::ArgByValueType<V> result, TimeStampType freshAsOf);
840 template <typename K = KEY, typename V = VALUE>
841 requires (not IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackExpiration)
842 nonvirtual
void Add (typename Common::ArgByValueType<V> result, TimeStampType expiresAt);
846 template <typename K = KEY>
847 requires (IKeyedCache<K> and IValuelessCache<VALUE> and TRAITS::kTrackExpiration)
848 nonvirtual
void Add_ (typename Common::ArgByValueType<K> key, TimeStampType expiresAt);
849 template <typename K = KEY>
850 requires (IKeyedCache<K> and IValuelessCache<VALUE> and TRAITS::kTrackFreshness)
851 nonvirtual
void Add_ (typename Common::ArgByValueType<K> key, TimeStampType freshAsOf);
853 template <typename K = KEY, typename V = VALUE>
854 requires (IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackFreshness)
855 nonvirtual
void Add_ (typename Common::ArgByValueType<K> key, typename Common::ArgByValueType<V> result, TimeStampType freshAsOf);
856 template <typename K = KEY, typename V = VALUE>
857 requires (IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackExpiration)
858 nonvirtual
void Add_ (typename Common::ArgByValueType<K> key, typename Common::ArgByValueType<V> result, TimeStampType expiresAt);
859 template <typename K = KEY, typename V = VALUE>
860 requires (not IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackFreshness)
861 nonvirtual
void Add_ (typename Common::ArgByValueType<V> result, TimeStampType freshAsOf);
862 template <typename K = KEY, typename V = VALUE>
863 requires (not IKeyedCache<K> and not IValuelessCache<V> and TRAITS::kTrackExpiration)
864 nonvirtual
void Add_ (typename Common::ArgByValueType<V> result, TimeStampType expiresAt);
869 template <typename K = KEY>
870 requires (IKeyedCache<K>)
871 nonvirtual
void Remove (typename Common::ArgByValueType<K> key);
876 template <qCompilerAndStdLib_ConstraintDiffersInTemplateRedeclaration_BWA (predicate<typename
TimedCache<KEY, VALUE, TRAITS>::
CacheElement>) PREDICATE>
877 nonvirtual
void RemoveAll (PREDICATE&& p);
883 template <Traversal::IIterableOfTo<KEY> ITERABLE_OF_KEY_TYPE>
884 nonvirtual
void RetainAll (const ITERABLE_OF_KEY_TYPE& items2Keep);
890 nonvirtual
void clear ();
899 nonvirtual
void ClearExpiredData ();
900 nonvirtual
void ClearExpiredData (TimeStampDifferenceType maxAge)
901 requires (TRAITS::kTrackFreshness);
906 nonvirtual typename TRAITS::StatsType GetStats () const;
909 nonvirtual
void AutomaticallyClearExpiredDataSometimes_ ()
910 requires (IKeyedCache<KEY>);
913 DISABLE_COMPILER_MSC_WARNING_START (4996);
914 DISABLE_COMPILER_GCC_WARNING_START ("GCC diagnostic ignored \"-Wdeprecated-declarations\"");
915 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wdeprecated-declarations\"");
916 using LookupMarksDataAsRefreshed
917 [[deprecated ("Since Stroika 3.0d23 use TRAITS kAutomaticallyMarkDataAsRefreshedEachTimeAccessed")]] =
918 TimedCacheSupport::LookupMarksDataAsRefreshed;
919 using PurgeSpoiledDataFlagType
920 [[deprecated ("Since Stroika v3.0d23 - use TRAITS::kAutomaticallyMarkDataAsRefreshedEachTimeAccessed instead")]] =
921 TimedCacheSupport::PurgeSpoiledDataFlagType;
922 [[deprecated ("Since Stroika v3.0d1, use ClearExpiredData or count on Add's purgeSpoiledData parameter)")]] nonvirtual
void DoBookkeeping ()
926 [[deprecated (
"Since Stroika 3.0d1 use GetMaxAge")]]
Time::Duration GetTimeout ()
const
930 [[deprecated (
"Since Stroika 3.0d1 use GetMaxAge")]]
void SetTimeout (
Time::Duration timeout)
934 [[deprecated (
"Since Stroika 3.0d23 use GetMaxAge")]]
939 [[deprecated (
"Since Stroika 3.0d23 use SetMaxAge")]]
940 nonvirtual
void SetMinimumAllowedFreshness (Time::Duration minimumAllowedFreshness)
942 SetMaxAge (minimumAllowedFreshness);
944 template <
typename K = KEY>
945 requires (IKeyedCache<K> and TRAITS::kTrackFreshness)
946 [[deprecated (
"Since Stroika 3.0d23 use maxAge DURATION directly")]]
947 optional<VALUE> Lookup (
typename Common::ArgByValueType<K> key, TimeStampType maxAge)
const
949 return Lookup (key, Ago (maxAge));
951 template <
typename K = KEY>
952 [[deprecated (
"Since Stroika 3.0d23 use maxAge DURATION directly")]]
953 nonvirtual optional<tuple<VALUE, TimeStampType>> LookupDetails (
typename Common::ArgByValueType<K> key, TimeStampType maxAge)
const
954 requires (TRAITS::kTrackFreshness and IKeyedCache<K>)
959 template <
typename K = KEY, Common::invocable_r<VALUE> CACHE_FILLTER_T>
960 requires (not IKeyedCache<K> and TRAITS::kTrackFreshness)
961 nonvirtual VALUE LookupValue (TimeStampType maxAge, CACHE_FILLTER_T&& cacheFiller)
963 return Lookup (Ago (maxAge), forward<CACHE_FILLTER_T> (cacheFiller));
965 template <
typename K = KEY, Common::invocable_r<VALUE, KEY> CACHE_FILLTER_T>
966 requires (IKeyedCache<K> and TRAITS::kTrackFreshness)
967 [[deprecated (
"Since Stroika 3.0d23 use maxAge DURATION directly")]]
968 nonvirtual VALUE LookupValue (
typename Common::ArgByValueType<K> key, TimeStampType maxAge, CACHE_FILLTER_T&& cacheFiller)
970 return Lookup (key, Ago (maxAge), forward<CACHE_FILLTER_T> (cacheFiller));
972 template <
typename K = KEY>
973 [[deprecated (
"Since Stroika v3.0d23 - use TRAITS::kAutomaticallyMarkDataAsRefreshedEachTimeAccessed instead")]]
976 scoped_lock critSec{fMaybeMutex_};
977 typename MyMapType_::iterator i = fData_.find (key);
978 TimeStampType now = TRAITS::GetCurrentTimestamp ();
979 if (i == fData_.end ()) {
980 fStats_.IncrementMisses ();
984 TimeStampType lastAccessThreshold = now - fMaxAge_;
985 if (i->second.fLastRefreshedAt < lastAccessThreshold) {
994 fStats_.IncrementMisses ();
997 if (successfulLookupRefreshesAcceesFlag == LookupMarksDataAsRefreshed::eTreatFoundThroughLookupAsRefreshed) {
998 i->second.fLastRefreshedAt = TRAITS::GetCurrentTimestamp ();
1000 fStats_.IncrementHits ();
1001 return i->second.fResult;
1004 template <
typename K = KEY>
1005 requires (IKeyedCache<K>)
1006 [[deprecated (
"Since Stroika v3.0d23 - use kAutomaticPurgeFrequency in TRAITS instead of PurgeSpoiledDataFlagType, and "
1007 "kAutomaticallyMarkDataAsRefreshedEachTimeAccessed in TRAITS instead of LookupMarksDataAsRefreshed")]]
1009 LookupMarksDataAsRefreshed successfulLookupRefreshesAcceesFlag,
1010 PurgeSpoiledDataFlagType purgeSpoiledData = PurgeSpoiledDataFlagType::eAutomaticallyPurgeSpoiledData)
1012 auto&& readLock = shared_lock{fMaybeMutex_};
1013 if (optional<VALUE> o = Lookup (key, successfulLookupRefreshesAcceesFlag)) {
1018 VALUE v = cacheFiller (key);
1019 Add (key, v, purgeSpoiledData);
1023 template <
typename K = KEY,
typename V = VALUE>
1024 requires (IKeyedCache<K> and not IValuelessCache<V>)
1025 [[deprecated (
"Since Stroika v3.0d23 - use kAutomaticPurgeFrequency in TRAITS instead of PurgeSpoiledDataFlagType")]]
1026 nonvirtual
void Add (
typename Common::ArgByValueType<K> key,
typename Common::ArgByValueType<V> result, PurgeSpoiledDataFlagType purgeSpoiledData)
1028 scoped_lock critSec{fMaybeMutex_};
1029 if (purgeSpoiledData == PurgeSpoiledDataFlagType::eAutomaticallyPurgeSpoiledData) {
1030 AutomaticallyClearExpiredDataSometimes_ ();
1032 typename MyMapType_::iterator i = fData_.find (key);
1033 if (i == fData_.end ()) {
1034 fData_.insert ({key, MyResult_{.fResult = result, .fLastRefreshedAt = TRAITS::GetCurrentTimestamp ()}});
1037 i->second = MyResult_{.fResult = result, .fLastRefreshedAt = TRAITS::GetCurrentTimestamp ()};
1040 template <
typename K = KEY>
1041 [[deprecated (
"Since Stroika v3.0d23 - use LookupDetails")]]
1042 nonvirtual optional<VALUE> Lookup (
typename Common::ArgByValueType<K> key, TimeStampType* lastRefreshedAt)
const
1043 requires (TRAITS::kTrackFreshness)
1045 if (
auto r = LookupDetails (key)) {
1046 if (lastRefreshedAt !=
nullptr) {
1047 *lastRefreshedAt = get<2> (*r);
1052 template <
typename K = KEY>
1053 [[deprecated (
"Since Stroika v3.0d23 - use LookupDetails")]]
1054 nonvirtual optional<VALUE> Lookup (
typename Common::ArgByValueType<K> key, TimeStampType* lastRefreshedAt)
1055 requires (TRAITS::kTrackFreshness)
1057 if (
auto r = LookupDetails (key)) {
1058 if (lastRefreshedAt !=
nullptr) {
1059 *lastRefreshedAt = get<2> (*r);
1064 template <
typename K = KEY>
1065 [[deprecated (
"Since Stroika v3.0d23 - use LookupDetails")]]
1066 nonvirtual optional<VALUE> Lookup (
typename Common::ArgByValueType<K> key, TimeStampType* expiresAt)
const
1067 requires (TRAITS::kTrackExpiration)
1069 if (
auto r = LookupDetails (key)) {
1070 if (expiresAt !=
nullptr) {
1071 *expiresAt = get<2> (*r);
1076 template <
typename K = KEY>
1077 [[deprecated (
"Since Stroika v3.0d23 - use LookupDetails")]]
1078 nonvirtual optional<VALUE> Lookup (
typename Common::ArgByValueType<K> key, TimeStampType* expiresAt)
1079 requires (TRAITS::kTrackExpiration)
1081 if (
auto r = LookupDetails (key)) {
1082 if (expiresAt !=
nullptr) {
1083 *expiresAt = get<2> (*r);
1088 DISABLE_COMPILER_MSC_WARNING_END (4996);
1089 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
1090 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wdeprecated-declarations\"");
1094 using MaybeMutexType_ =
1095 conditional_t<TRAITS::kInternallySynchronized == Execution::InternallySynchronized::eInternallySynchronized, shared_timed_mutex, Debug::AssertExternallySynchronizedMutex>;
1101 conditional_t<TRAITS::kAutomaticPurgeFrequency == TimeStampDifferenceType{TimedCacheSupport::kNoAutomaticPurgeSentinal}, Common::Empty, TimeStampType>
1105 nonvirtual
void ClearExpired_ ()
1106 requires (IKeyedCache<KEY>);
1107 nonvirtual
void ClearExpired_ (TimeStampDifferenceType maxAge)
1108 requires (IKeyedCache<KEY> and TRAITS::kTrackFreshness);
1117 template <
typename K = KEY>
1118 nonvirtual CacheElement MakeCacheElement (
const K& key)
const;
1122 nonvirtual
bool Expired_ (
const MyResult_& r, TimeStampType now = TRAITS::GetCurrentTimestamp ())
const;
1127 conditional_t<IKeyedCache<KEY>, Common::LazyType_t<map, KEY, MyResult_, typename TRAITS::InOrderComparerType>, optional<MyResult_>>;
1132 template <
typename K = KEY, Common::invocable_r<VALUE> CACHE_FILLTER_T>
1133 requires (not IKeyedCache<K>)
1134 nonvirtual VALUE LockingLookupValueAdder_ (CACHE_FILLTER_T&& cacheFiller);
1135 template <
typename K = KEY, Common::invocable_r<VALUE, KEY> CACHE_FILLTER_T>
1136 requires (IKeyedCache<K>)
1137 nonvirtual VALUE LockingLookupValueAdder_ (
typename Common::ArgByValueType<K> key, CACHE_FILLTER_T&& cacheFiller);