1b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/*
2b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Copyright (C) 2011 The Android Open Source Project
3b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
4b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Licensed under the Apache License, Version 2.0 (the "License");
5b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * you may not use this file except in compliance with the License.
6b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You may obtain a copy of the License at
7b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
8b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *      http://www.apache.org/licenses/LICENSE-2.0
9b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson *
10b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Unless required by applicable law or agreed to in writing, software
11b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * distributed under the License is distributed on an "AS IS" BASIS,
12b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * See the License for the specific language governing permissions and
14b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * limitations under the License.
15b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */
16b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
17b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#ifndef FRAMEWORKS_EX_VARIABLESPEED_JNI_MACROS_H_
18b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#define FRAMEWORKS_EX_VARIABLESPEED_JNI_MACROS_H_
19b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
20b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <hlogging.h>
21b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
22b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsoninline float min(float a, float b) {
23b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  return (a < b) ? a : b;
24b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
25b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
26b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsoninline float max(float a, float b) {
27b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  return (a > b) ? a : b;
28b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
29b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
30b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsontemplate <class ForwardIterator>
31b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    ForwardIterator min_element(ForwardIterator first, ForwardIterator last) {
32b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  ForwardIterator lowest = first;
33b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  if (first == last) return last;
34b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  while (++first != last)
35b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    if (*first < *lowest)
36b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson      lowest = first;
37b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  return lowest;
38b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
39b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
40b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// A macro to disallow the copy constructor and operator= functions
41b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// This should be used in the private: declarations for a class
42b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
43b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  TypeName(const TypeName&);               \
44b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  void operator=(const TypeName&)
45b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
46b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#define CHECK(x) { \
47b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  if (!(x)) { \
48b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    LOGE("assertion failed: " #x); \
49b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    LOGE("file: %s line: %d", __FILE__, __LINE__); \
50b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    int* frob = NULL; \
51b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson    *frob = 5; \
52b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  } \
53b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
54b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
55b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsontemplate <class Dest, class Source>
56b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsoninline Dest bit_cast(const Source& source) {
57b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  // Compile time assertion: sizeof(Dest) == sizeof(Source)
58b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  // A compile error here means your Dest and Source have different sizes.
59b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : -1];  // NOLINT
60b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
61b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  Dest dest;
62b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  memcpy(&dest, &source, sizeof(dest));
63b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson  return dest;
64b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}
65b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson
66b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#endif  // FRAMEWORKS_EX_VARIABLESPEED_JNI_MACROS_H_
67