diff options
Diffstat (limited to '3rdparty/glm/test/external/gli/core/comparison.inl')
| -rw-r--r-- | 3rdparty/glm/test/external/gli/core/comparison.inl | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/3rdparty/glm/test/external/gli/core/comparison.inl b/3rdparty/glm/test/external/gli/core/comparison.inl new file mode 100644 index 00000000000..df920b480c0 --- /dev/null +++ b/3rdparty/glm/test/external/gli/core/comparison.inl @@ -0,0 +1,100 @@ +#include <cstring> + +namespace gli{ +namespace detail +{ + inline bool equalData(texture const & TextureA, texture const & TextureB) + { + GLI_ASSERT(TextureA.size() == TextureB.size()); + + if(TextureA.data() == TextureB.data()) + return true; + + for(texture::size_type LayerIndex = 0, LayerCount = TextureA.layers(); LayerIndex < LayerCount; ++LayerIndex) + for(texture::size_type FaceIndex = 0, FaceCount = TextureA.faces(); FaceIndex < FaceCount; ++FaceIndex) + for(texture::size_type LevelIndex = 0, LevelCount = TextureA.levels(); LevelIndex < LevelCount; ++LevelIndex) + { + void const* PointerA = TextureA.data(LayerIndex, FaceIndex, LevelIndex); + void const* PointerB = TextureB.data(LayerIndex, FaceIndex, LevelIndex); + if(std::memcmp(PointerA, PointerB, TextureA.size(LevelIndex)) != 0) + return false; + } + + return true; + } +}//namespace detail + + inline bool operator==(image const & ImageA, image const & ImageB) + { + if(!glm::all(glm::equal(ImageA.extent(), ImageB.extent()))) + return false; + if(ImageA.size() != ImageB.size()) + return false; + + return std::memcmp(ImageA.data(), ImageB.data(), ImageA.size()) == 0; + } + + inline bool operator!=(image const & ImageA, image const & ImageB) + { + if(!glm::all(glm::equal(ImageA.extent(), ImageB.extent()))) + return true; + if(ImageA.size() != ImageB.size()) + return true; + + return std::memcmp(ImageA.data(), ImageB.data(), ImageA.size()) != 0; + } + + inline bool equal(texture const & TextureA, texture const & TextureB) + { + if(TextureA.empty() && TextureB.empty()) + return true; + if(TextureA.empty() != TextureB.empty()) + return false; + if(TextureA.target() != TextureB.target()) + return false; + if(TextureA.layers() != TextureB.layers()) + return false; + if(TextureA.faces() != TextureB.faces()) + return false; + if(TextureA.levels() != TextureB.levels()) + return false; + if(TextureA.format() != TextureB.format()) + return false; + if(TextureA.size() != TextureB.size()) + return false; + + return detail::equalData(TextureA, TextureB); + } + + inline bool notEqual(texture const & TextureA, texture const & TextureB) + { + if(TextureA.empty() && TextureB.empty()) + return false; + if(TextureA.empty() != TextureB.empty()) + return true; + if(TextureA.target() != TextureB.target()) + return true; + if(TextureA.layers() != TextureB.layers()) + return true; + if(TextureA.faces() != TextureB.faces()) + return true; + if(TextureA.levels() != TextureB.levels()) + return true; + if(TextureA.format() != TextureB.format()) + return true; + if(TextureA.size() != TextureB.size()) + return true; + + return !detail::equalData(TextureA, TextureB); + } + + inline bool operator==(texture const & A, texture const & B) + { + return gli::equal(A, B); + } + + inline bool operator!=(texture const & A, texture const & B) + { + return gli::notEqual(A, B); + } +}//namespace gli |
