From e889aa35b4e73d938851f3a2209e98bc2c4d7115 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Wed, 30 May 2012 20:20:43 +1000 Subject: [PATCH] Add forgotten coord base class header --- detail/coord.hpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 detail/coord.hpp diff --git a/detail/coord.hpp b/detail/coord.hpp new file mode 100644 index 00000000..8e577f8f --- /dev/null +++ b/detail/coord.hpp @@ -0,0 +1,93 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2012 Danny Robson + */ + +#ifndef __UTIL_COORD_HPP +#define __UTIL_COORD_HPP + +namespace util { + namespace detail { + // Disable GCC warnings about validity of anonyous structures in + // unions. Push comes to shove I'll manually redsign everything to + // keep this syntax anyway. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-pedantic" + template + struct coord_data { + coord_data () { ; } + + template + coord_data (T ...t): data{t...} + { ; } + + double data[S]; + }; + + template <> + struct coord_data<1> { + coord_data () { ; } + + template + coord_data (T ...t): data{t...} + { ; } + + union { + double data[1]; + double x; + }; + }; + + template <> + struct coord_data<2> { + coord_data () { ; } + + template + coord_data (T ...t): data{t...} + { ; } + + union { + double data[2]; + struct { + double x; + double y; + }; + }; + }; + + template <> + struct coord_data<3> { + union { + double data[3]; + struct { + double x; + double y; + double z; + }; + }; + + coord_data () { ; } + + template + coord_data (T... t): data{t...} + { ; } + }; +#pragma GCC diagnostic pop + } +} + +#endif