C++ API Reference RNBO: common/RNBO_PlatformInterface.h Source File

RNBO: common/RNBO_PlatformInterface.h Source File

1 //
2 // _RNBO_PlatformInterface_H_
3 //
4 // Created by Rob Sussman on 5/18/16.
5 //
6 //
7 
8 #ifndef _RNBO_PlatformInterface_H_
9 #define _RNBO_PlatformInterface_H_
10 
11 #include "RNBO_Types.h"
12 
13 #if !defined(RNBO_PLATFORM_ASSERT_WARN)
14  #ifdef RNBO_DEBUG
15  #define RNBO_PLATFORM_ASSERT_WARN 0
16  #else
17  #define RNBO_PLATFORM_ASSERT_WARN 1
18  #endif
19 #endif
20 
21 #if !defined(RNBO_PLATFORM_ERROR_WARN)
22  #ifdef RNBO_DEBUG
23  #define RNBO_PLATFORM_ERROR_WARN 0
24  #else
25  #define RNBO_PLATFORM_ERROR_WARN 1
26  #endif
27 #endif
28 
29 
30 namespace RNBO {
31 
42  class PlatformInterface;
43 
44  using PlatformInterfacePtr = PlatformInterface*;
45 
49  class Platform
50  {
51  private:
52 
53  static PlatformInterfacePtr& instance()
54  {
55  static PlatformInterface* pInstance = nullptr;
56  return pInstance;
57  }
58 
59  public:
60 
61  static PlatformInterface* get()
62  {
63  return instance();
64  }
65 
66  static void set(PlatformInterface* platformInterface)
67  {
68  PlatformInterfacePtr& theInstance = instance();
69  theInstance = platformInterface;
70  }
71 
72  };
73 
74  enum class RuntimeError {
75  OutOfRange
76  };
77 
79  {
80 
81  protected:
82  PlatformInterface() = default;
83  virtual ~PlatformInterface() = default;
84 
85  public:
86  void resetWarnings() {
87 #if RNBO_PLATFORM_ERROR_WARN==1
88  mErrorWarned = false;
89 #endif
90 #if RNBO_PLATFORM_ASSERT_WARN==1
91  mAssertWarned = false;
92 #endif
93  }
94 
98  virtual void printMessage(const char* message) = 0;
99 
105  virtual void printErrorMessage(const char* message) {
106  printMessage(message);
107  }
108 
117  virtual void* malloc(size_t bytes) = 0;
118 
129  virtual void* calloc(size_t num, size_t size) = 0;
130 
141  virtual void* realloc(void* ptr, size_t bytes) = 0;
142 
148  virtual void free(void* ptr) = 0;
149 
161  virtual void* memcpy(void* dest, const void* src, size_t n) = 0;
162 
175  virtual void* memmove(void* dest, const void* src, size_t n) = 0;
176 
186  virtual void* memset(void *dest, int value, size_t n) = 0;
187 
195  virtual size_t strlen(const char* s) = 0;
196 
207  virtual int strcmp(const char* s1, const char* s2) = 0;
208 
217  virtual char* strcpy(char* dest, const char* src) = 0;
218 
219  // string formatting
220  virtual void toString(char* str, size_t maxlen, number val) = 0;
221  virtual void toString(char* str, size_t maxlen, int val) = 0;
222  virtual void toString(char* str, size_t maxlen, unsigned int val) = 0;
223  virtual void toString(char* str, size_t maxlen, long val) = 0;
224  virtual void toString(char* str, size_t maxlen, long long val) = 0;
225  virtual void toString(char* str, size_t maxlen, unsigned long val) = 0;
226  virtual void toString(char* str, size_t maxlen, unsigned long long val) = 0;
227  virtual void toString(char* str, size_t maxlen, void* val) = 0;
228 
229  virtual void abort() = 0;
230 
234  virtual void error(RuntimeError e, const char* str) = 0;
235 
239  virtual void assertTrue(bool v, const char* str) = 0;
240 
241  template <typename T>
242  T errorOrDefault(RuntimeError e, const char* str, T def) {
243 #if RNBO_PLATFORM_ERROR_WARN==1
244  RNBO_UNUSED(e);
245  //warn
246  if (once(mErrorWarned)) {
247  printErrorMessage(str);
248  }
249 #else
250  error(e, str);
251 #endif
252  return def;
253  }
254 
255  template <typename T>
256  T assertTrueOrDefault(bool v, const char* str, T def) {
257 #if RNBO_PLATFORM_ASSERT_WARN==1
258  //warn
259  if (!v && once(mAssertWarned)) {
260  printErrorMessage(str);
261  }
262 #else
263  assertTrue(v, str);
264 #endif
265  return def;
266  }
267  private:
268 #if RNBO_PLATFORM_ASSERT_WARN==1 || RNBO_PLATFORM_ERROR_WARN==1
269  bool once(bool& v) {
270  bool have = v;
271  v = true;
272  return !have;
273  }
274 #endif
275 #if RNBO_PLATFORM_ASSERT_WARN==1
276  bool mAssertWarned = false;
277 #endif
278 #if RNBO_PLATFORM_ERROR_WARN==1
279  bool mErrorWarned = false;
280 #endif
281  };
282 
283 } // namespace RNBO
284 
285 #endif // #ifndef _RNBO_PlatformInterface_H_