Don't try to access XlogFileScopeInfo->category if not supported
[folly.git] / folly / experimental / logging / LogStreamProcessor.h
index f5fec5e23aba37391f0ae01fb144f0720fa3852c..66db917c641be826ddbfe691227ade7fe93925e9 100644 (file)
@@ -108,39 +108,29 @@ class LogStreamProcessor {
       AppendType) noexcept;
 
   /**
-   * LogStreamProcessor constructors for use with XLOG() macros with no extra
-   * arguments.
+   * LogStreamProcessor constructor for use with a LOG() macro with arguments
+   * to be concatenated with folly::to<std::string>()
    *
-   * These are defined separately from the above constructor so that the work
-   * of initializing the XLOG LogCategory data is done in a separate function
-   * body defined in LogStreamProcessor.cpp.  We intentionally want to avoid
-   * inlining this work at every XLOG() statement, to reduce the emitted code
-   * size.
+   * Note that the filename argument is not copied.  The caller should ensure
+   * that it points to storage that will remain valid for the lifetime of the
+   * LogStreamProcessor.  (This is always the case for the __FILE__
+   * preprocessor macro.)
    */
+  template <typename... Args>
   LogStreamProcessor(
-      XlogCategoryInfo<true>* categoryInfo,
-      LogLevel level,
-      folly::StringPiece categoryName,
-      bool isCategoryNameOverridden,
-      folly::StringPiece filename,
-      unsigned int lineNumber,
-      AppendType) noexcept;
-  LogStreamProcessor(
-      XlogFileScopeInfo* fileScopeInfo,
-      LogLevel level,
-      folly::StringPiece filename,
-      unsigned int lineNumber,
-      AppendType) noexcept;
-  LogStreamProcessor(
-      XlogFileScopeInfo* fileScopeInfo,
+      const LogCategory* category,
       LogLevel level,
-      folly::StringPiece /* categoryName */,
-      bool /* isCategoryNameOverridden */,
       folly::StringPiece filename,
       unsigned int lineNumber,
-      AppendType) noexcept
-      : LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
-  }
+      AppendType,
+      Args&&... args) noexcept
+      : LogStreamProcessor(
+            category,
+            level,
+            filename,
+            lineNumber,
+            INTERNAL,
+            createLogString(std::forward<Args>(args)...)) {}
 
   /**
    * LogStreamProcessor constructor for use with a LOG() macro with arguments
@@ -157,7 +147,8 @@ class LogStreamProcessor {
       LogLevel level,
       folly::StringPiece filename,
       unsigned int lineNumber,
-      AppendType,
+      FormatType,
+      folly::StringPiece fmt,
       Args&&... args) noexcept
       : LogStreamProcessor(
             category,
@@ -165,11 +156,25 @@ class LogStreamProcessor {
             filename,
             lineNumber,
             INTERNAL,
-            createLogString(std::forward<Args>(args)...)) {}
+            formatLogString(fmt, std::forward<Args>(args)...)) {}
 
-  /**
-   * Versions of the above constructor for use in XLOG() statements.
+  /*
+   * Versions of the above constructors for use in XLOG() statements.
+   *
+   * These are defined separately from the above constructor so that the work
+   * of initializing the XLOG LogCategory data is done in a separate function
+   * body defined in LogStreamProcessor.cpp.  We intentionally want to avoid
+   * inlining this work at every XLOG() statement, to reduce the emitted code
+   * size.
    */
+  LogStreamProcessor(
+      XlogCategoryInfo<true>* categoryInfo,
+      LogLevel level,
+      folly::StringPiece categoryName,
+      bool isCategoryNameOverridden,
+      folly::StringPiece filename,
+      unsigned int lineNumber,
+      AppendType) noexcept;
   template <typename... Args>
   LogStreamProcessor(
       XlogCategoryInfo<true>* categoryInfo,
@@ -191,72 +196,69 @@ class LogStreamProcessor {
             createLogString(std::forward<Args>(args)...)) {}
   template <typename... Args>
   LogStreamProcessor(
-      XlogFileScopeInfo* fileScopeInfo,
+      XlogCategoryInfo<true>* categoryInfo,
       LogLevel level,
-      folly::StringPiece /* categoryName */,
-      bool /* isCategoryNameOverridden */,
+      folly::StringPiece categoryName,
+      bool isCategoryNameOverridden,
       folly::StringPiece filename,
       unsigned int lineNumber,
-      AppendType,
+      FormatType,
+      folly::StringPiece fmt,
       Args&&... args) noexcept
       : LogStreamProcessor(
-            fileScopeInfo,
+            categoryInfo,
             level,
+            categoryName,
+            isCategoryNameOverridden,
             filename,
             lineNumber,
             INTERNAL,
-            createLogString(std::forward<Args>(args)...)) {}
+            formatLogString(fmt, std::forward<Args>(args)...)) {}
 
-  /**
-   * LogStreamProcessor constructor for use with a LOG() macro with arguments
-   * to be concatenated with folly::to<std::string>()
+#ifdef __INCLUDE_LEVEL__
+  /*
+   * Versions of the above constructors to use in XLOG() macros that appear in
+   * .cpp files.  These are only used if the compiler supports the
+   * __INCLUDE_LEVEL__ macro, which we need to determine that the XLOG()
+   * statement is not in a header file.
    *
-   * Note that the filename argument is not copied.  The caller should ensure
-   * that it points to storage that will remain valid for the lifetime of the
-   * LogStreamProcessor.  (This is always the case for the __FILE__
-   * preprocessor macro.)
+   * These behave identically to the XlogCategoryInfo<true> versions of the
+   * APIs, but slightly more optimized, and allow the XLOG() code to avoid
+   * storing category information at each XLOG() call site.
    */
-  template <typename... Args>
   LogStreamProcessor(
-      const LogCategory* category,
+      XlogFileScopeInfo* fileScopeInfo,
       LogLevel level,
       folly::StringPiece filename,
       unsigned int lineNumber,
-      FormatType,
-      folly::StringPiece fmt,
-      Args&&... args) noexcept
-      : LogStreamProcessor(
-            category,
-            level,
-            filename,
-            lineNumber,
-            INTERNAL,
-            formatLogString(fmt, std::forward<Args>(args)...)) {}
-
-  /**
-   * Versions of the above constructor for use in XLOG() statements.
-   */
+      AppendType) noexcept;
+  LogStreamProcessor(
+      XlogFileScopeInfo* fileScopeInfo,
+      LogLevel level,
+      folly::StringPiece /* categoryName */,
+      bool /* isCategoryNameOverridden */,
+      folly::StringPiece filename,
+      unsigned int lineNumber,
+      AppendType) noexcept
+      : LogStreamProcessor(fileScopeInfo, level, filename, lineNumber, APPEND) {
+  }
   template <typename... Args>
   LogStreamProcessor(
-      XlogCategoryInfo<true>* categoryInfo,
+      XlogFileScopeInfo* fileScopeInfo,
       LogLevel level,
-      folly::StringPiece categoryName,
-      bool isCategoryNameOverridden,
+      folly::StringPiece /* categoryName */,
+      bool /* isCategoryNameOverridden */,
       folly::StringPiece filename,
       unsigned int lineNumber,
-      FormatType,
-      folly::StringPiece fmt,
+      AppendType,
       Args&&... args) noexcept
       : LogStreamProcessor(
-            categoryInfo,
+            fileScopeInfo,
             level,
-            categoryName,
-            isCategoryNameOverridden,
             filename,
             lineNumber,
             INTERNAL,
-            formatLogString(fmt, std::forward<Args>(args)...)) {}
-
+            createLogString(std::forward<Args>(args)...)) {}
   template <typename... Args>
   LogStreamProcessor(
       XlogFileScopeInfo* fileScopeInfo,
@@ -275,6 +277,7 @@ class LogStreamProcessor {
             lineNumber,
             INTERNAL,
             formatLogString(fmt, std::forward<Args>(args)...)) {}
+#endif
 
   ~LogStreamProcessor() noexcept;