📄 wordvector.h
字号:
#ifndef NTL_WordVector__H#define NTL_WordVector__H/************************************************************** A WordVector is essentially functionally similar to a generic NTL vector of _ntl_ulong. Be careful! the MaxLength() function does not return the max length ever set, but rather the max space allocated, which *may* be more. The FixLength() facility is not available. The reason for special-casing is efficiency (of course).**************************************************************/#include <NTL/tools.h>#include <NTL/ZZ.h>NTL_OPEN_NNS#ifndef NTL_RANGE_CHECK#define NTL_WV_RANGE_CHECK_CODE #else#define NTL_WV_RANGE_CHECK_CODE if (i < 0 || !rep || i >= long(rep[-1])) RangeError(i);#endif// vectors are allocated in chunks of this size#ifndef NTL_WordVectorMinAlloc#define NTL_WordVectorMinAlloc (4)#endif// vectors are always expanded by at least this ratio#ifndef NTL_WordVectorExpansionRatio#define NTL_WordVectorExpansionRatio (1.2)#endif// controls initialization during input#ifndef NTL_WordVectorInputBlock#define NTL_WordVectorInputBlock 50#endifclass WordVector { public: _ntl_ulong *rep; void RangeError(long i) const; WordVector(WordVector& x, INIT_TRANS_TYPE) { rep = x.rep; x.rep = 0; } WordVector() { rep = 0; } WordVector(INIT_SIZE_TYPE, long n) { rep = 0; DoSetLength(n); } WordVector(const WordVector& a) { rep = 0; *this = a; } WordVector& operator=(const WordVector& a); ~WordVector(); void kill(); void DoSetLength(long n); void SetLength(long n) { _ntl_ulong *x = rep; if (x && long(x[-2] >> 1) >= n && n >= 0) x[-1] = n; else DoSetLength(n); } void ZeroLength() { if (rep) rep[-1] = 0; } void SetMaxLength(long n); void QuickSetLength(long n) { rep[-1] = _ntl_ulong(n); } long length() const { return (!rep) ? 0 : long(rep[-1]); } long MaxLength() const { return (!rep) ? 0 : long(rep[-2] >> 1); } _ntl_ulong& operator[](long i) { NTL_WV_RANGE_CHECK_CODE return rep[i]; } const _ntl_ulong& operator[](long i) const { NTL_WV_RANGE_CHECK_CODE return rep[i]; } _ntl_ulong& operator()(long i) { return (*this)[i-1]; } const _ntl_ulong& operator()(long i) const { return (*this)[i-1]; } const _ntl_ulong* elts() const { return rep; } _ntl_ulong* elts() { return rep; } static void swap_impl(WordVector& x, WordVector& y); static void append_impl(WordVector& v, _ntl_ulong a); static void append_impl(WordVector& v, const WordVector& w); }; inline void swap(WordVector& x, WordVector& y) { WordVector::swap_impl(x, y); }inline void append(WordVector& v, _ntl_ulong a) { WordVector::append_impl(v, a); }inline void append(WordVector& v, const WordVector& w) { WordVector::append_impl(v, w); }NTL_SNS istream& operator>>(NTL_SNS istream&, WordVector&); NTL_SNS ostream& operator<<(NTL_SNS ostream&, const WordVector&); long operator==(const WordVector& a, const WordVector& b); long operator!=(const WordVector& a, const WordVector& b);long InnerProduct(const WordVector& a, const WordVector& b);void ShiftAdd(_ntl_ulong *cp, const _ntl_ulong* ap, long sa, long n);// cp = cp + (a << n)NTL_CLOSE_NNS#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -