@@ -353,6 +353,60 @@ namespace NActors {
353353 void DoActorInit () { LastUsageTimestamp = GetCycleCountFast (); }
354354 };
355355
356+ class TActorActivityType {
357+ public:
358+ TActorActivityType ()
359+ : TActorActivityType(FromEnum(EInternalActorType::OTHER))
360+ {}
361+
362+ template <typename EEnum>
363+ static TActorActivityType FromEnum (EEnum activityType) requires (std::is_enum_v<EEnum>) {
364+ return FromIndex (TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex (activityType));
365+ }
366+
367+ static TActorActivityType FromName (TStringBuf activityName) {
368+ return FromIndex (TLocalProcessKeyState<TActorActivityTag>::GetInstance ().Register (activityName));
369+ }
370+
371+ template <const char * Name>
372+ static TActorActivityType FromStaticName () {
373+ return FromIndex (TLocalProcessKey<TActorActivityTag, Name>::GetIndex ());
374+ }
375+
376+ template <typename T>
377+ static TActorActivityType FromTypeName () {
378+ // 200 characters is limit for solomon metric tag length
379+ return FromIndex (TLocalProcessExtKey<TActorActivityTag, T, 200 >::GetIndex ());
380+ }
381+
382+ static constexpr TActorActivityType FromIndex (size_t index) {
383+ return TActorActivityType (index);
384+ }
385+
386+ constexpr ui32 GetIndex () const {
387+ return Index;
388+ }
389+
390+ TStringBuf GetName () const {
391+ return TLocalProcessKeyState<TActorActivityTag>::GetInstance ().GetNameByIndex (Index);
392+ }
393+
394+ friend constexpr bool operator ==(TActorActivityType a, TActorActivityType b) = default ;
395+
396+ template <typename EEnum>
397+ friend bool operator ==(TActorActivityType a, EEnum b) requires (std::is_enum_v<EEnum>) {
398+ return a == FromEnum (b);
399+ }
400+
401+ private:
402+ explicit constexpr TActorActivityType (ui32 index)
403+ : Index(index)
404+ {}
405+
406+ private:
407+ ui32 Index;
408+ };
409+
356410 class IActor
357411 : protected IActorOps
358412 , public TActorUsageImpl<ActorLibCollectUsageStats>
@@ -374,13 +428,6 @@ namespace NActors {
374428 friend class TExecutorPoolBaseMailboxed ;
375429 friend class TExecutorThread ;
376430
377- IActor (const ui32 activityType)
378- : SelfActorId(TActorId())
379- , ElapsedTicks(0 )
380- , ActivityType(activityType)
381- , HandledEvents(0 ) {
382- }
383-
384431 protected:
385432 TActorCallbackBehaviour CImpl;
386433 public:
@@ -389,29 +436,34 @@ namespace NActors {
389436 // / @sa services.proto NKikimrServices::TActivity::EType
390437 using EActorActivity = EInternalActorType;
391438 using EActivityType = EActorActivity;
392- ui32 ActivityType;
439+ TActorActivityType ActivityType;
393440
394441 protected:
395442 ui64 HandledEvents;
396443
397- template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool >::type v = true >
398- IActor (const EEnum activityEnumType = EActivityType::OTHER)
399- : IActor(TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
400- }
444+ IActor (TActorActivityType activityType = {})
445+ : SelfActorId(TActorId())
446+ , ElapsedTicks(0 )
447+ , ActivityType(activityType)
448+ , HandledEvents(0 )
449+ {}
401450
402- IActor (TActorCallbackBehaviour&& cImpl, const ui32 activityType)
451+ IActor (TActorCallbackBehaviour&& cImpl, TActorActivityType activityType = {} )
403452 : SelfActorId(TActorId())
404453 , ElapsedTicks(0 )
405454 , CImpl(std::move(cImpl))
406455 , ActivityType(activityType)
407456 , HandledEvents(0 )
408- {
409- }
457+ {}
410458
411- template <typename EEnum = EActivityType, typename std::enable_if<std::is_enum<EEnum>::value, bool >::type v = true >
412- IActor (TActorCallbackBehaviour&& cImpl, const EEnum activityEnumType = EActivityType::OTHER)
413- : IActor(std::move(cImpl), TEnumProcessKey<TActorActivityTag, EEnum>::GetIndex(activityEnumType)) {
414- }
459+ template <typename EEnum>
460+ IActor (TActorCallbackBehaviour&& cImpl, EEnum activityType) requires (std::is_enum_v<EEnum>)
461+ : IActor(std::move(cImpl), TActorActivityType::FromEnum(activityType))
462+ {}
463+
464+ IActor (TActorCallbackBehaviour&& cImpl, TStringBuf activityName)
465+ : IActor(std::move(cImpl), TActorActivityType::FromName(activityName))
466+ {}
415467
416468 public:
417469 template <class TEventBase >
@@ -463,10 +515,19 @@ namespace NActors {
463515 virtual void PassAway ();
464516
465517 protected:
466- void SetActivityType (ui32 activityType) {
518+ void SetActivityType (TActorActivityType activityType) {
467519 ActivityType = activityType;
468520 }
469521
522+ template <typename EEnum>
523+ void SetActivityType (EEnum activityType) requires (std::is_enum_v<EEnum>) {
524+ ActivityType = TActorActivityType::FromEnum (activityType);
525+ }
526+
527+ void SetActivityType (TStringBuf activityName) {
528+ ActivityType = TActorActivityType::FromName (activityName);
529+ }
530+
470531 public:
471532 class TPassAwayGuard : TMoveOnly {
472533 private:
@@ -531,7 +592,7 @@ namespace NActors {
531592 void AddElapsedTicks (i64 ticks) {
532593 ElapsedTicks += ticks;
533594 }
534- ui32 GetActivityType () const {
595+ TActorActivityType GetActivityType () const {
535596 return ActivityType;
536597 }
537598 ui64 GetHandledEvents () const {
@@ -639,18 +700,20 @@ namespace NActors {
639700 return TLocalProcessKeyState<TActorActivityTag>::GetInstance ().GetNameByIndex (index);
640701 }
641702
703+ inline TStringBuf GetActivityTypeName (TActorActivityType activityType) {
704+ return activityType.GetName ();
705+ }
706+
642707 class IActorCallback : public IActor {
643708 protected:
644- template <class TEnum = IActor::EActivityType>
645- IActorCallback (TReceiveFunc stateFunc, const TEnum activityType = IActor::EActivityType::OTHER)
646- : IActor(TActorCallbackBehaviour(stateFunc), activityType) {
647-
648- }
649-
650- IActorCallback (TReceiveFunc stateFunc, const ui32 activityType)
651- : IActor(TActorCallbackBehaviour(stateFunc), activityType) {
709+ IActorCallback (TReceiveFunc stateFunc)
710+ : IActor(TActorCallbackBehaviour(stateFunc))
711+ {}
652712
653- }
713+ template <typename T>
714+ IActorCallback (TReceiveFunc stateFunc, T&& activityType)
715+ : IActor(TActorCallbackBehaviour(stateFunc), std::forward<T>(activityType))
716+ {}
654717
655718 public:
656719 template <typename T>
@@ -679,49 +742,32 @@ namespace NActors {
679742 private:
680743 using TDerivedReceiveFunc = void (TDerived::*)(TAutoPtr<IEventHandle>& ev);
681744
682- template <typename T, typename = const char *>
683- struct HasActorName : std::false_type {};
684- template <typename T>
685- struct HasActorName <T, decltype ((void )T::ActorName, (const char *)nullptr )>: std::true_type {};
686-
687- template <typename T, typename = const char *>
688- struct HasActorActivityType : std::false_type {};
689- template <typename T>
690- struct HasActorActivityType <T, decltype ((void )T::ActorActivityType, (const char *)nullptr )>: std::true_type {};
691-
692- static ui32 GetActivityTypeIndexImpl () {
693- if constexpr (HasActorName<TDerived>::value) {
694- return TLocalProcessKey<TActorActivityTag, TDerived::ActorName>::GetIndex ();
695- } else if constexpr (HasActorActivityType<TDerived>::value) {
696- using TActorActivity = decltype (((TDerived*)nullptr )->ActorActivityType ());
697- static_assert (std::is_enum<TActorActivity>::value);
698- return TEnumProcessKey<TActorActivityTag, TActorActivity>::GetIndex (TDerived::ActorActivityType ());
745+ static TActorActivityType GetDefaultActivityTypeImpl () {
746+ if constexpr (requires { TDerived::ActorName; }) {
747+ return TActorActivityType::FromStaticName<TDerived::ActorName>();
748+ } else if constexpr (requires { TDerived::ActorActivityType; }) {
749+ return TActorActivityType::FromEnum (TDerived::ActorActivityType ());
699750 } else {
700- // 200 characters is limit for solomon metric tag length
701- return TLocalProcessExtKey<TActorActivityTag, TDerived, 200 >::GetIndex ();
751+ return TActorActivityType::FromTypeName<TDerived>();
702752 }
703753 }
704754
705- static ui32 GetActivityTypeIndex () {
706- static const ui32 result = GetActivityTypeIndexImpl ();
755+ static TActorActivityType GetDefaultActivityType () {
756+ static const TActorActivityType result = GetDefaultActivityTypeImpl ();
707757 return result;
708758 }
709759
710760 protected:
711761 // static constexpr char ActorName[] = "UNNAMED";
712762
713763 TActor (TDerivedReceiveFunc func)
714- : IActorCallback(static_cast <TReceiveFunc>(func), GetActivityTypeIndex ()) {
715- }
764+ : IActorCallback(static_cast <TReceiveFunc>(func), GetDefaultActivityType ())
765+ { }
716766
717- template <class TEnum = EActivityType>
718- TActor (TDerivedReceiveFunc func, const TEnum activityEnumType = EActivityType::OTHER)
719- : IActorCallback(static_cast <TReceiveFunc>(func), activityEnumType) {
720- }
721-
722- TActor (TDerivedReceiveFunc func, const TString& actorName)
723- : IActorCallback(static_cast <TReceiveFunc>(func), TLocalProcessKeyState<TActorActivityTag>::GetInstance().Register(actorName)) {
724- }
767+ template <typename T>
768+ TActor (TDerivedReceiveFunc func, T&& activityType)
769+ : IActorCallback(static_cast <TReceiveFunc>(func), std::forward<T>(activityType))
770+ {}
725771
726772 public:
727773 typedef TDerived TThis;
0 commit comments