|
@@ -116,90 +116,6 @@ public:
|
|
|
ZT_INLINE bool operator>=(const Address &a) const noexcept { return _a >= a._a; }
|
|
|
ZT_INLINE bool operator<=(const Address &a) const noexcept { return _a <= a._a; }
|
|
|
|
|
|
-#if 0
|
|
|
- /**
|
|
|
- * Create a list of the first N bits of a list of unique addresses with N as the minimum unique size
|
|
|
- *
|
|
|
- * The list is stored in a space-efficient packed bit format.
|
|
|
- *
|
|
|
- * @param start Starting Address iterator/pointer
|
|
|
- * @param end Ending Address iterator/pointer
|
|
|
- * @param list Pointer to location to write list
|
|
|
- * @param listCapacityBytes Number of bytes available for list
|
|
|
- * @return Number of bytes written or -1 on overflow or other error
|
|
|
- * @tparam I Input iterator type
|
|
|
- */
|
|
|
- template<typename I>
|
|
|
- static inline int createMinPrefixList(I start,I end,uint8_t *list,const int listCapacityBytes)
|
|
|
- {
|
|
|
- std::vector<Address> sortedAddrs(start,end);
|
|
|
- if (sortedAddrs.empty())
|
|
|
- return 0;
|
|
|
- if (listCapacityBytes == 0)
|
|
|
- return -1;
|
|
|
- std::sort(sortedAddrs.begin(),sortedAddrs.end());
|
|
|
-
|
|
|
- unsigned int bits = (unsigned int)fmaxf(log2f((float)(sortedAddrs.size() * 2)),3.0F);
|
|
|
- uint64_t mask;
|
|
|
-try_additional_bits: {
|
|
|
- mask = 0xffffffffffffffffULL >> (64 - bits);
|
|
|
- std::vector<Address>::iterator a(sortedAddrs.begin());
|
|
|
- uint64_t aa = *(a++) & mask;
|
|
|
- aa |= (uint64_t)(aa == 0);
|
|
|
- uint64_t lastMaskedAddress = aa;
|
|
|
- while (a != sortedAddrs.end()) {
|
|
|
- aa = *(a++) & mask;
|
|
|
- aa |= (uint64_t)(aa == 0);
|
|
|
- if (aa == lastMaskedAddress) {
|
|
|
- ++bits;
|
|
|
- goto try_additional_bits;
|
|
|
- }
|
|
|
- lastMaskedAddress = aa;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- int l = 0;
|
|
|
- unsigned int bitPtr = 0;
|
|
|
- for(I a(start);a!=end;) {
|
|
|
- uint64_t aa = *(a++) & mask;
|
|
|
- aa |= (uint64_t)(aa == 0);
|
|
|
- unsigned int br = bits;
|
|
|
- if (bitPtr > 0) {
|
|
|
- unsigned int w = 8 - bitPtr;
|
|
|
- if (w > br) w = br;
|
|
|
- list[l] = (list[l] << w) | (((uint8_t)aa) & (0xff >> (8 - w)));
|
|
|
- bitPtr += w;
|
|
|
- if (bitPtr == 8) {
|
|
|
- bitPtr = 0;
|
|
|
- if (l >= listCapacityBytes)
|
|
|
- return -1;
|
|
|
- ++l;
|
|
|
- }
|
|
|
- aa >>= w;
|
|
|
- br -= w;
|
|
|
- }
|
|
|
- while (br >= 8) {
|
|
|
- if (l >= listCapacityBytes)
|
|
|
- return -1;
|
|
|
- list[l++] = (uint8_t)aa;
|
|
|
- br -= 8;
|
|
|
- aa >>= 8;
|
|
|
- }
|
|
|
- if (br > 0) {
|
|
|
- list[l] = (uint8_t)aa;
|
|
|
- bitPtr = br;
|
|
|
- }
|
|
|
- }
|
|
|
- if (bitPtr > 0) {
|
|
|
- if (l >= listCapacityBytes)
|
|
|
- return -1;
|
|
|
- ++l;
|
|
|
- }
|
|
|
-
|
|
|
- return l;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
private:
|
|
|
uint64_t _a;
|
|
|
};
|