4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief LLSocketAddress and LLAddressingPolicy non-inline template implementation
27 #include "LLAddressing.ih"
35 ///////////////////////////////ct.p////////////////////////////////////////
37 template <class ForwardRange>
38 prefix_ void senf::LLSocketAddress::address(ForwardRange const & address)
40 if (boost::size(address) > sizeof(addr_.sll_addr))
41 throw InvalidLLSocketAddressException();
42 typename boost::range_const_iterator<ForwardRange>::type i (boost::begin(address));
43 ::memset(&addr_.sll_addr[0],sizeof(addr_.sll_addr),0);
45 for (; i != boost::end(address) && addr_.sll_halen<8; ++i, ++addr_.sll_halen)
46 addr_.sll_addr[addr_.sll_halen] = *i;
47 if (i != boost::end(address))
48 throw InvalidLLSocketAddressException();
51 template <class ForwardRange>
53 senf::llAddress(ForwardRange const & address,
54 typename boost::enable_if< boost::is_class<ForwardRange> >::type *)
56 if (boost::empty(address))
59 typename boost::range_const_iterator< ForwardRange >::type i (boost::begin(address));
61 s << std::hex << std::setw(2) << std::setfill('0') << unsigned(*i);
63 if (i == boost::end(address))
70 template <class ForwardRange>
71 prefix_ unsigned char senf::detail::HexConverter::operator()(ForwardRange const & v)
74 if (boost::size(v) != 2)
75 throw InvalidLLSocketAddressException();
76 typename boost::range_iterator< ForwardRange >::type i (boost::begin(v));
77 unsigned char n1 = hexnibble(*i) << 4;
78 return n1 + hexnibble(*(++i));
81 ///////////////////////////////ct.e////////////////////////////////////////
87 // c-file-style: "senf"