CP2PListLibrary 1.0

compact_list.hpp

00001 /*
00002    Copyright (C) 2004-2005 Cory Nelson
00003 
00004    This software is provided 'as-is', without any express or implied
00005    warranty.  In no event will the authors be held liable for any damages
00006    arising from the use of this software.
00007 
00008    Permission is granted to anyone to use this software for any purpose,
00009    including commercial applications, and to alter it and redistribute it
00010    freely, subject to the following restrictions:
00011 
00012    1. The origin of this software must not be misrepresented; you must not
00013       claim that you wrote the original software. If you use this software
00014       in a product, an acknowledgment in the product documentation would be
00015       appreciated but is not required.
00016    2. Altered source versions must be plainly marked as such, and must not be
00017       misrepresented as being the original software.
00018    3. This notice may not be removed or altered from any source distribution.
00019    
00020    CVS Info :
00021       $Author: phrostbyte $
00022       $Date: 2005/07/01 01:32:09 $
00023       $Revision: 1.2 $
00024 */
00025 
00026 #ifndef __P2P_COMPACT_LIST_HPP__
00027 #define __P2P_COMPACT_LIST_HPP__
00028 
00029 #include <utility>
00030 #include <boost/scoped_array.hpp>
00031 #include <boost/utility.hpp>
00032 #include <p2p/list.hpp>
00033 #include <p2p/range.hpp>
00034 
00035 namespace p2p {
00036    class compact_list : boost::noncopyable {
00037    public:
00038       typedef std::pair<unsigned int,unsigned int> range_type;
00039 
00040    private:
00041       boost::scoped_array<range_type> _ranges;
00042       int _rangecount;
00043 
00044    public:
00045       compact_list(const class list &l);
00046 
00047       int size() const { return _rangecount; }
00048       unsigned int ip_count() const;
00049 
00050       const range_type& operator[](int index) const { return _ranges[index]; }
00051 
00052       const range_type *operator()(unsigned int ip) const;
00053       const range_type *operator()(const range_type &r) const;
00054       const range_type *operator()(const struct range &r) const;
00055    };
00056 }
00057 
00058 #endif