| 
									
										
										
										
											2019-11-03 18:54:03 -05:00
										 |  |  | // Copyright 2019 yuzu emulator team
 | 
					
						
							| 
									
										
										
										
											2014-12-16 21:38:14 -08:00
										 |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-17 13:45:50 -04:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-08 18:27:29 -04:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2019-11-03 18:54:03 -05:00
										 |  |  | #include <array>
 | 
					
						
							| 
									
										
										
										
											2018-07-19 09:03:30 -04:00
										 |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-13 11:34:45 +01:00
										 |  |  | #if !defined(ARCHITECTURE_x86_64)
 | 
					
						
							| 
									
										
										
										
											2016-04-30 16:34:51 +01:00
										 |  |  | #include <cstdlib> // for exit
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-05-27 16:14:10 -07:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-11 13:32:31 -02:00
										 |  |  | /// Textually concatenates two tokens. The double-expansion is required by the C preprocessor.
 | 
					
						
							|  |  |  | #define CONCAT2(x, y) DO_CONCAT2(x, y)
 | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | #define DO_CONCAT2(x, y) x##y
 | 
					
						
							| 
									
										
										
										
											2015-01-11 13:32:31 -02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-03 18:54:03 -05:00
										 |  |  | /// Helper macros to insert unused bytes or words to properly align structs. These values will be
 | 
					
						
							|  |  |  | /// zero-initialized.
 | 
					
						
							| 
									
										
										
										
											2019-11-14 16:54:01 -05:00
										 |  |  | #define INSERT_PADDING_BYTES(num_bytes)                                                            \
 | 
					
						
							|  |  |  |     std::array<u8, num_bytes> CONCAT2(pad, __LINE__) {} | 
					
						
							|  |  |  | #define INSERT_PADDING_WORDS(num_words)                                                            \
 | 
					
						
							|  |  |  |     std::array<u32, num_words> CONCAT2(pad, __LINE__) {} | 
					
						
							| 
									
										
										
										
											2015-02-12 20:57:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-03 18:54:03 -05:00
										 |  |  | /// These are similar to the INSERT_PADDING_* macros, but are needed for padding unions. This is
 | 
					
						
							|  |  |  | /// because unions can only be initialized by one member.
 | 
					
						
							| 
									
										
										
										
											2019-11-14 16:54:01 -05:00
										 |  |  | #define INSERT_UNION_PADDING_BYTES(num_bytes) std::array<u8, num_bytes> CONCAT2(pad, __LINE__)
 | 
					
						
							|  |  |  | #define INSERT_UNION_PADDING_WORDS(num_words) std::array<u32, num_words> CONCAT2(pad, __LINE__)
 | 
					
						
							| 
									
										
										
										
											2015-05-06 23:26:19 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | #ifndef _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 22:29:08 -04:00
										 |  |  | #ifdef ARCHITECTURE_x86_64
 | 
					
						
							| 
									
										
										
										
											2015-01-20 17:16:47 -08:00
										 |  |  | #define Crash() __asm__ __volatile__("int $3")
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define Crash() exit(1)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | #else // _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2016-05-27 10:40:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Locale Cross-Compatibility
 | 
					
						
							|  |  |  | #define locale_t _locale_t
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							| 
									
										
										
										
											2016-09-18 09:38:01 +09:00
										 |  |  | __declspec(dllimport) void __stdcall DebugBreak(void); | 
					
						
							| 
									
										
										
										
											2016-05-27 10:40:01 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-18 18:01:46 -07:00
										 |  |  | #define Crash() DebugBreak()
 | 
					
						
							| 
									
										
										
										
											2016-05-27 10:40:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-28 21:38:20 -08:00
										 |  |  | #endif // _MSC_VER ndef
 | 
					
						
							| 
									
										
										
										
											2013-09-04 20:17:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Generic function to get last error message.
 | 
					
						
							|  |  |  | // Call directly after the command or use the error num.
 | 
					
						
							|  |  |  | // This function might change the error code.
 | 
					
						
							|  |  |  | // Defined in Misc.cpp.
 | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  | [[nodiscard]] std::string GetLastErrorMsg(); | 
					
						
							| 
									
										
										
										
											2017-10-15 00:11:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  | #define DECLARE_ENUM_FLAG_OPERATORS(type)                                                          \
 | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  |     [[nodiscard]] constexpr type operator|(type a, type b) noexcept {                              \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							|  |  |  |         return static_cast<type>(static_cast<T>(a) | static_cast<T>(b));                           \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  |     [[nodiscard]] constexpr type operator&(type a, type b) noexcept {                              \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							|  |  |  |         return static_cast<type>(static_cast<T>(a) & static_cast<T>(b));                           \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							| 
									
										
										
										
											2020-08-24 04:39:26 -04:00
										 |  |  |     [[nodiscard]] constexpr type operator^(type a, type b) noexcept {                              \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							| 
									
										
										
										
											2020-08-24 04:39:26 -04:00
										 |  |  |         return static_cast<type>(static_cast<T>(a) ^ static_cast<T>(b));                           \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							|  |  |  |     constexpr type& operator|=(type& a, type b) noexcept {                                         \ | 
					
						
							|  |  |  |         a = a | b;                                                                                 \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         return a;                                                                                  \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							|  |  |  |     constexpr type& operator&=(type& a, type b) noexcept {                                         \ | 
					
						
							| 
									
										
										
										
											2020-08-24 04:39:26 -04:00
										 |  |  |         a = a & b;                                                                                 \ | 
					
						
							|  |  |  |         return a;                                                                                  \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							|  |  |  |     constexpr type& operator^=(type& a, type b) noexcept {                                         \ | 
					
						
							|  |  |  |         a = a ^ b;                                                                                 \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         return a;                                                                                  \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  |     [[nodiscard]] constexpr type operator~(type key) noexcept {                                    \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							|  |  |  |         return static_cast<type>(~static_cast<T>(key));                                            \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  |     [[nodiscard]] constexpr bool True(type key) noexcept {                                         \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							|  |  |  |         return static_cast<T>(key) != 0;                                                           \ | 
					
						
							|  |  |  |     }                                                                                              \ | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  |     [[nodiscard]] constexpr bool False(type key) noexcept {                                        \ | 
					
						
							| 
									
										
										
										
											2020-03-20 22:40:03 -04:00
										 |  |  |         using T = std::underlying_type_t<type>;                                                    \ | 
					
						
							|  |  |  |         return static_cast<T>(key) == 0;                                                           \ | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-15 00:11:38 -04:00
										 |  |  | namespace Common { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 09:38:45 -04:00
										 |  |  | [[nodiscard]] constexpr u32 MakeMagic(char a, char b, char c, char d) { | 
					
						
							| 
									
										
										
										
											2019-11-13 06:50:49 -05:00
										 |  |  |     return u32(a) | u32(b) << 8 | u32(c) << 16 | u32(d) << 24; | 
					
						
							| 
									
										
										
										
											2017-10-15 00:11:38 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Common
 |