/*
 * Copyright 2017 Google
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef FIRMessaging_xcodeproj_FIRMessagingDefines_h
#define FIRMessaging_xcodeproj_FIRMessagingDefines_h

#define _FIRMessaging_VERBOSE_LOGGING 1

// Verbose Logging
#if (_FIRMessaging_VERBOSE_LOGGING)
#define FIRMessaging_DEV_VERBOSE_LOG(...) NSLog(__VA_ARGS__)
#else
#define FIRMessaging_DEV_VERBOSE_LOG(...) do { } while (0)
#endif // FIRMessaging_VERBOSE_LOGGING


// WEAKIFY & STRONGIFY
// Helper macro.
#define _FIRMessaging_WEAKNAME(VAR) VAR ## _weak_

#define FIRMessaging_WEAKIFY(VAR) __weak __typeof__(VAR) _FIRMessaging_WEAKNAME(VAR) = (VAR);

#define FIRMessaging_STRONGIFY(VAR) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong __typeof__(VAR) VAR = _FIRMessaging_WEAKNAME(VAR); \
_Pragma("clang diagnostic pop")


// Type Conversions (used for NSInteger etc)
#ifndef _FIRMessaging_L
#define _FIRMessaging_L(v) (long)(v)
#endif

#ifndef _FIRMessaging_UL
#define _FIRMessaging_UL(v) (unsigned long)(v)
#endif

#endif

// Debug Assert
#ifndef _FIRMessagingDevAssert
// we directly invoke the NSAssert handler so we can pass on the varargs
// (NSAssert doesn't have a macro we can use that takes varargs)
#ifdef DEBUG
#define _FIRMessagingDevAssert(condition, ...)                                       \
  do {                                                                      \
    if (!(condition)) {                                                     \
      [[NSAssertionHandler currentHandler]                                  \
          handleFailureInFunction:(NSString *)                              \
                                      [NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
                             file:(NSString *)[NSString stringWithUTF8String:__FILE__]  \
                       lineNumber:__LINE__                                  \
                      description:__VA_ARGS__];                             \
    }                                                                       \
  } while(0)
#else // !defined(DEBUG)
#define _FIRMessagingDevAssert(condition, ...) do { } while (0)
#endif // !defined(DEBUG)

#endif // _FIRMessagingDevAssert

// Invalidates the initializer from which it's called.
#ifndef FIRMessagingInvalidateInitializer
#define FIRMessagingInvalidateInitializer() \
  do { \
    [self class]; /* Avoid warning of dead store to |self|. */ \
    _FIRMessagingDevAssert(NO, @"Invalid initializer."); \
    return nil; \
  } while (0)
#endif
