terminate.hpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*************************************************************************
  2. *
  3. * Copyright 2016 Realm Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. **************************************************************************/
  18. #ifndef REALM_UTIL_TERMINATE_HPP
  19. #define REALM_UTIL_TERMINATE_HPP
  20. #include <cstdlib>
  21. #include <realm/util/features.h>
  22. #include <realm/util/to_string.hpp>
  23. #include <realm/version.hpp>
  24. #define REALM_TERMINATE(msg) realm::util::terminate((msg), __FILE__, __LINE__)
  25. namespace realm {
  26. namespace util {
  27. REALM_NORETURN void terminate(const char* message, const char* file, long line,
  28. std::initializer_list<Printable>&& = {}) noexcept;
  29. REALM_NORETURN void terminate_with_info(const char* message, const char* file, long line,
  30. const char* interesting_names,
  31. std::initializer_list<Printable>&& = {}) noexcept;
  32. // LCOV_EXCL_START
  33. template <class... Ts>
  34. REALM_NORETURN void terminate(const char* message, const char* file, long line, Ts... infos) noexcept
  35. {
  36. static_assert(sizeof...(infos) == 2 || sizeof...(infos) == 4 || sizeof...(infos) == 6,
  37. "Called realm::util::terminate() with wrong number of arguments");
  38. terminate(message, file, line, {Printable(infos)...});
  39. }
  40. template <class... Args>
  41. REALM_NORETURN void terminate_with_info(const char* assert_message, int line, const char* file,
  42. const char* interesting_names, Args&&... interesting_values) noexcept
  43. {
  44. terminate_with_info(assert_message, file, line, interesting_names, {Printable(interesting_values)...});
  45. }
  46. // LCOV_EXCL_STOP
  47. } // namespace util
  48. } // namespace realm
  49. #endif // REALM_UTIL_TERMINATE_HPP