BSDSocketAddress.cci
Go to the documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028
00029 #include <memory.h>
00030 #include <algorithm>
00031 #include <typeinfo>
00032
00033 #define prefix_ inline
00034
00035
00036
00037
00038
00039 prefix_ struct sockaddr const * senf::BSDSocketAddress::sockaddr_p()
00040 const
00041 {
00042 return static_cast<GenericBSDSocketAddress const *>(this)->sockaddr_p();
00043 }
00044
00045 prefix_ short senf::BSDSocketAddress::family()
00046 const
00047 {
00048 return sockaddr_p()->sa_family;
00049 }
00050
00051 prefix_ socklen_t senf::BSDSocketAddress::socklen()
00052 const
00053 {
00054 return len_;
00055 }
00056
00057 prefix_ socklen_t const * senf::BSDSocketAddress::socklen_p()
00058 const
00059 {
00060 return & len_;
00061 }
00062
00063 prefix_ void senf::BSDSocketAddress::socklen(socklen_t len)
00064 {
00065 len_ = len;
00066 }
00067
00068 prefix_ bool senf::BSDSocketAddress::operator==(BSDSocketAddress const & other)
00069 const
00070 {
00071 return socklen()==other.socklen() && memcmp(sockaddr_p(), other.sockaddr_p(), socklen())==0;
00072 }
00073
00074 prefix_ bool senf::BSDSocketAddress::operator<(BSDSocketAddress const & other)
00075 const
00076 {
00077 if (socklen() < other.socklen()) return true;
00078 else if (socklen() > other.socklen()) return false;
00079 else return memcmp(sockaddr_p(), other.sockaddr_p(), socklen()) < 0;
00080 }
00081
00082 prefix_ bool senf::BSDSocketAddress::boolean_test()
00083 const
00084 {
00085 return socklen() > sizeof(short) && family() != AF_UNSPEC &&
00086 unsigned(std::count(reinterpret_cast<unsigned char const *>(sockaddr_p())+sizeof(short),
00087 reinterpret_cast<unsigned char const *>(sockaddr_p())+socklen(),
00088 0u)) < socklen()-2;
00089 }
00090
00091
00092
00093
00094 prefix_ senf::BSDSocketAddress::BSDSocketAddress(socklen_t len, short family)
00095 : len_ (len)
00096 {
00097 ::memset(sockaddr_p(), 0u, len_);
00098 sockaddr_p()->sa_family = family;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 prefix_ senf::BSDSocketAddress::BSDSocketAddress(BSDSocketAddress const & other)
00114 : len_ (other.socklen())
00115 {
00116 ::memcpy(sockaddr_p(), other.sockaddr_p(), len_);
00117 }
00118
00119 prefix_ senf::BSDSocketAddress &
00120 senf::BSDSocketAddress::operator=(BSDSocketAddress const & other)
00121 {
00122 len_ = other.socklen();
00123 ::memmove(sockaddr_p(), other.sockaddr_p(), len_);
00124 return *this;
00125 }
00126
00127
00128 prefix_ struct sockaddr * senf::BSDSocketAddress::sockaddr_p()
00129 {
00130 return static_cast<GenericBSDSocketAddress *>(this)->sockaddr_p();
00131 }
00132
00133 prefix_ socklen_t * senf::BSDSocketAddress::socklen_p()
00134 {
00135 return & len_;
00136 }
00137
00138
00139
00140
00141 template <class Target>
00142 prefix_ Target & senf::sockaddr_cast(BSDSocketAddress & source)
00143 {
00144 if (source.family() != Target::addressFamily)
00145 throw std::bad_cast();
00146 return static_cast<Target &>(source);
00147 }
00148
00149 template <class Target>
00150 prefix_ Target const & senf::sockaddr_cast(BSDSocketAddress const & source)
00151 {
00152 if (source.family() != Target::addressFamily)
00153 throw std::bad_cast();
00154 return static_cast<Target const &>(source);
00155 }
00156
00157
00158
00159
00160 prefix_ senf::GenericBSDSocketAddress::GenericBSDSocketAddress()
00161 : BSDSocketAddress(sizeof(sockaddr_storage), AF_UNSPEC)
00162 {}
00163
00164 prefix_ senf::GenericBSDSocketAddress::GenericBSDSocketAddress(BSDSocketAddress const & other)
00165 : BSDSocketAddress(other)
00166 {}
00167
00168 prefix_ senf::GenericBSDSocketAddress&
00169 senf::GenericBSDSocketAddress::operator=(const BSDSocketAddress & other)
00170 {
00171 BSDSocketAddress::operator=(other);
00172 return *this;
00173 }
00174
00175 prefix_
00176 senf::GenericBSDSocketAddress::GenericBSDSocketAddress(const GenericBSDSocketAddress& other)
00177 : BSDSocketAddress(other)
00178 {}
00179
00180 prefix_ senf::GenericBSDSocketAddress&
00181 senf::GenericBSDSocketAddress::operator=(const GenericBSDSocketAddress& other)
00182 {
00183 BSDSocketAddress::operator=(other);
00184 return *this;
00185 }
00186
00187 prefix_ struct sockaddr const * senf::GenericBSDSocketAddress::sockaddr_p()
00188 const
00189 {
00190 return static_cast<struct sockaddr const *>(static_cast<void const *>(& addr_));
00191 }
00192
00193 prefix_ struct sockaddr * senf::GenericBSDSocketAddress::sockaddr_p()
00194 {
00195 return static_cast<struct sockaddr *>(static_cast<void *>(& addr_));
00196 }
00197
00198
00199 #undef prefix_
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210