// Copyright 2012 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission 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. // // See http://creativecommons.org/licenses/MIT/ for more information. #ifndef STMLIB_STMLIB_H_ #define STMLIB_STMLIB_H_ #include #include #ifndef NULL #define NULL 0 #endif #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #define CLIP(x) if (x < -32767) x = -32767; if (x > 32767) x = 32767; #define CONSTRAIN(var, min, max) \ if (var < (min)) { \ var = (min); \ } else if (var > (max)) { \ var = (max); \ } #define JOIN(lhs, rhs) JOIN_1(lhs, rhs) #define JOIN_1(lhs, rhs) JOIN_2(lhs, rhs) #define JOIN_2(lhs, rhs) lhs##rhs #define STATIC_ASSERT(expression, message)\ struct JOIN(__static_assertion_at_line_, __LINE__)\ {\ impl::StaticAssertion((expression))> JOIN(JOIN(JOIN(STATIC_ASSERTION_FAILED_AT_LINE_, __LINE__), _), message);\ };\ typedef impl::StaticAssertionTest JOIN(__static_assertion_test_at_line_, __LINE__) namespace impl { template struct StaticAssertion; template <> struct StaticAssertion { }; // StaticAssertion template struct StaticAssertionTest { }; // StaticAssertionTest } // namespace impl #ifndef TEST #define IN_RAM __attribute__ ((section (".ramtext"))) #else #define IN_RAM #endif // TEST #define UNROLL2(x) x; x; #define UNROLL4(x) x; x; x; x; #define UNROLL8(x) x; x; x; x; x; x; x; x; template inline void StaticAssertImplementation() { char static_assert_size_mismatch[b] = { 0 }; } namespace stmlib { typedef union { uint16_t value; uint8_t bytes[2]; } Word; typedef union { uint32_t value; uint16_t words[2]; uint8_t bytes[4]; } LongWord; template struct FourCC { static const uint32_t value = (((((d << 8) | c) << 8) | b) << 8) | a; }; } // namespace stmlib #endif // STMLIB_STMLIB_H_