/* * ZeroTier One - Global Peer to Peer Ethernet * Copyright (C) 2012-2013 ZeroTier Networks LLC * * This program 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. * * This program 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 this program. If not, see . * * -- * * ZeroTier may be used and distributed under the terms of the GPLv3, which * are available at: http://www.gnu.org/licenses/gpl-3.0.html * * If you would like to embed ZeroTier into a commercial application or * redistribute it in a modified binary form, please contact ZeroTier Networks * LLC. Start here: http://www.zerotier.com/ */ #ifndef _ZT_ARRAY_HPP #define _ZT_ARRAY_HPP #include #include namespace ZeroTier { /** * Static array -- a simple thing that's belonged in STL since the time of the dinosaurs */ template class Array { public: Array() throw() {} Array(const Array &a) { for(std::size_t i=0;i reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; inline iterator begin() throw() { return data; } inline iterator end() throw() { return &(data[S]); } inline const_iterator begin() const throw() { return data; } inline const_iterator end() const throw() { return &(data[S]); } inline reverse_iterator rbegin() throw() { return reverse_iterator(begin()); } inline reverse_iterator rend() throw() { return reverse_iterator(end()); } inline const_reverse_iterator rbegin() const throw() { return const_reverse_iterator(begin()); } inline const_reverse_iterator rend() const throw() { return const_reverse_iterator(end()); } inline std::size_t size() const throw() { return S; } inline std::size_t max_size() const throw() { return S; } inline reference operator[](const std::size_t n) throw() { return data[n]; } inline const_reference operator[](const std::size_t n) const throw() { return data[n]; } inline reference front() throw() { return data[0]; } inline const_reference front() const throw() { return data[0]; } inline reference back() throw() { return data[S-1]; } inline const_reference back() const throw() { return data[S-1]; } inline bool operator==(const Array &k) const throw() { return std::equal(begin(),end(),k.begin()); } inline bool operator<(const Array &k) const throw() { return std::lexicographical_compare(begin(),end(),k.begin(),k.end()); } inline bool operator!=(const Array &k) const throw() { return !(*this == k); } inline bool operator>(const Array &k) const throw() { return (k < *this); } inline bool operator<=(const Array &k) const throw() { return !(k < *this); } inline bool operator>=(const Array &k) const throw() { return !(*this < k); } T data[S]; }; } // namespace ZeroTier #endif