Browse Source

general actor id constructor for signals and stats

remove useless method necessary
ivanmorozov 1 year ago
parent
commit
e95c7683c7
2 changed files with 29 additions and 16 deletions
  1. 11 16
      library/cpp/actors/core/actor.h
  2. 18 0
      library/cpp/actors/util/local_process_key.h

+ 11 - 16
library/cpp/actors/core/actor.h

@@ -619,32 +619,27 @@ namespace NActors {
     class TActor: public IActorCallback {
     private:
         template <typename T, typename = const char*>
-        struct HasActorName: std::false_type { };
+        struct HasActorName: std::false_type {};
         template <typename T>
-        struct HasActorName<T, decltype((void)T::ActorName, (const char*)nullptr)>: std::true_type { };
+        struct HasActorName<T, decltype((void)T::ActorName, (const char*)nullptr)>: std::true_type {};
+
+        template <typename T, typename = const char*>
+        struct HasActorActivityType: std::false_type {};
+        template <typename T>
+        struct HasActorActivityType<T, decltype((void)T::ActorActivityType, (const char*)nullptr)>: std::true_type {};
 
         static ui32 GetActivityTypeIndex() {
             if constexpr(HasActorName<TDerived>::value) {
                 return TLocalProcessKey<TActorActivityTag, TDerived::ActorName>::GetIndex();
-            } else {
+            } else if constexpr (HasActorActivityType<TDerived>::value) {
                 using TActorActivity = decltype(((TDerived*)nullptr)->ActorActivityType());
-                // if constexpr(std::is_enum<TActorActivity>::value) {
-                    return TEnumProcessKey<TActorActivityTag, TActorActivity>::GetIndex(
-                    TDerived::ActorActivityType());
-                //} else {
-                    // for int, ui32, ...
-                //    return TEnumProcessKey<TActorActivityTag, IActor::EActorActivity>::GetIndex(
-                //        static_cast<IActor::EActorActivity>(TDerived::ActorActivityType()));
-                //}
+                return TEnumProcessKey<TActorActivityTag, TActorActivity>::GetIndex(TDerived::ActorActivityType());
+            } else {
+                return TLocalProcessExtKey<TActorActivityTag, TDerived>::GetIndex();
             }
         }
 
     protected:
-        //* Comment this function to find unmarked activities
-        static constexpr IActor::EActivityType ActorActivityType() {
-            return IActorCallback::EActorActivity::OTHER;
-        } //*/
-
         // static constexpr char ActorName[] = "UNNAMED";
 
         TActor(void (TDerived::*func)(TAutoPtr<IEventHandle>& ev, const TActorContext&), ui32 activityType = GetActivityTypeIndex())

+ 18 - 0
library/cpp/actors/util/local_process_key.h

@@ -12,6 +12,8 @@ class TLocalProcessKeyState {
 
 template <typename U, const char* Name>
 friend class TLocalProcessKey;
+template <typename U, class TClass>
+friend class TLocalProcessExtKey;
 template <typename U, typename EnumT>
 friend class TEnumProcessKey;
 
@@ -90,6 +92,22 @@ private:
     inline static size_t Index = TLocalProcessKeyState<T>::GetInstance().Register(Name);
 };
 
+template <typename T, class TClass>
+class TLocalProcessExtKey {
+public:
+    static TStringBuf GetName() {
+        return Name;
+    }
+
+    static size_t GetIndex() {
+        return Index;
+    }
+
+private:
+    static const inline TString Name = TypeName<TClass>();
+    inline static size_t Index = TLocalProcessKeyState<T>::GetInstance().Register(TypeName<TClass>());
+};
+
 template <typename T, typename EnumT>
 class TEnumProcessKey {
 public: