text: // Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
  //
  // You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
  // copy, modify, and distribute this software in source code or binary form for use
  // in connection with the web services and APIs provided by Facebook.
  //
  // As with any software that integrates with the Facebook platform, your use of
  // this software is subject to the Facebook Developer Principles and Policies
  // [http://developers.facebook.com/policy/]. This copyright notice shall be
  // included in all copies or substantial portions of the software.
  //
  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  
  #include <stdint.h>
  
  typedef double FBSDKMonotonicTimeSeconds;
  typedef uint64_t FBSDKMonotonicTimeMilliseconds;
  typedef uint64_t FBSDKMonotonicTimeNanoseconds;
  typedef uint64_t FBSDKMachAbsoluteTimeUnits;
  
  /**
   * return current monotonic time in Milliseconds
   * Millisecond precision, uint64_t value.
   * Avoids float/double math operations, thus more efficient than FBSDKMonotonicTimeGetCurrentSeconds.
   * Should be prefered over FBSDKMonotonicTimeGetCurrentSeconds in case millisecond
   * precision is requred.
   * IMPORTANT: this timer doesn't run while the device is sleeping.
   */
  FBSDKMonotonicTimeMilliseconds FBSDKMonotonicTimeGetCurrentMilliseconds(void);
  
  /**
   * return current monotonic time in Seconds
   * Nanosecond precision, double value.
   * Should be prefered over FBSDKMonotonicTimeGetCurrentMilliseconds in case
   * nanosecond precision is requred.
   * IMPORTANT: this timer doesn't run while the device is sleeping.
   */
  FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeGetCurrentSeconds(void);
  
  /**
   * return current monotonic time in NanoSeconds
   * Nanosecond precision, uint64_t value.
   * Useful when nanosecond precision is required but you want to avoid float/double math operations.
   * IMPORTANT: this timer doesn't run while the device is sleeping.
   */
  FBSDKMonotonicTimeNanoseconds FBSDKMonotonicTimeGetCurrentNanoseconds(void);
  
  /**
   * return number of MachTimeUnits for given number of seconds
   * this is useful when you want to use the really fast mach_absolute_time() function
   * to calculate deltas between two points and then check it against a (precomputed) threshold.
   * Nanosecond precision, uint64_t value.
   */
  FBSDKMachAbsoluteTimeUnits FBSDKMonotonicTimeConvertSecondsToMachUnits(FBSDKMonotonicTimeSeconds seconds);
  
  /**
   * return the number of seconds for a given amount of MachTimeUnits
   * this is useful when you want to use the really fast mach_absolute_time() function, take
   * deltas between time points, and when you're out of the timing critical section, use
   * this function to compute how many seconds the delta works out to be.
   */
  FBSDKMonotonicTimeSeconds FBSDKMonotonicTimeConvertMachUnitsToSeconds(FBSDKMachAbsoluteTimeUnits machUnits);
  