Exemple #1
0
void _VectorBase::_M_insert_overflow(void* __pos, size_t __count, const void* __data, size_t __unit_size)
{
    STL_ASSERT((static_cast<char*>(__pos) >= _M_get_start()) && (static_cast<char*>(__pos) <= _M_get_finish()) && (__data != NULL));
    size_t __new_size = _M_compute_next_size(__count, __unit_size);
    STL_ASSERT(__new_size > 0);
    void* __new_start = STL_Malloc(__new_size);
    void* __new_finish = _copy_trivial(_M_get_start(), __pos, __new_start);
    __new_finish = _fill_n_trivial(__new_finish, __count, __data, __unit_size);
    __new_finish = _copy_trivial(__pos, _M_get_finish(), __new_finish);
    _M_clear();
    _M_set(__new_start, __new_finish, static_cast<char*>(__new_start) + __new_size);
}
Exemple #2
0
stringbuf::int_type stringbuf::pbackfail(int_type __char) 
{
    if (gptr() == eback()) return EOF;
    STL_ASSERT(gptr() > eback());

    if (__char == EOF)
    {
        gbump(-1);
        return 0;
    }

    if (static_cast<char_type>(__char) == gptr()[-1])
    {
        gbump(-1);
        return __char;
    }

    if (__M_mode & ios_base::out)    // 要放回的字符与流中的不同,覆盖掉流中的字符。
    {
        gbump(-1);
        *gptr() = static_cast<char_type>(__char);
        return __char;
    }

    return EOF;
}
Exemple #3
0
// 传入的两个参数分别是待加入的新元素的个数和大小。
size_t _VectorBase::_M_compute_next_size(size_t __count, size_t __unit_size) const
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (__count <= _M_max_size(__unit_size)));
    const size_t __cur_size = _M_get_finish() - _M_get_start();
    size_t __next_size = __cur_size + max(__cur_size, __count * __unit_size);
    if ((__next_size > _M_max_size(__unit_size)) || (__next_size < __cur_size))   // overflow
    {
        __next_size = _M_max_size(__unit_size);
    }
    return __next_size;
}
Exemple #4
0
void _VectorBase::_M_reserve_and_clear(size_t __count)
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (_M_get_end_of_storage() >= _M_get_finish()));
    if (static_cast<size_t>(_M_get_end_of_storage() - _M_get_start()) >= __count)
    {
        return;
    }

    _M_clear();
    __M_start = __M_finish = STL_Malloc(__count);
    __M_end_of_storage = _M_get_start() + __count;
}
Exemple #5
0
void _VectorBase::_M_reserve(size_t __count)
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (_M_get_end_of_storage() >= _M_get_finish()));
    if (static_cast<size_t>(_M_get_end_of_storage() - _M_get_start()) >= __count)
    {
        return;
    }

    void* __new_start = STL_Malloc(__count);
    __M_finish = _copy_trivial(_M_get_start(), _M_get_finish(), __new_start);
    _M_clear();
    _M_set(__new_start, __M_finish, static_cast<char*>(__new_start) + __count);
}
Exemple #6
0
void _VectorBase::_M_fill_insert_aux(void* __pos, size_t __count, const void* __data, size_t __unit_size)
{
    STL_ASSERT((static_cast<char*>(__pos) >= _M_get_start()) && (static_cast<char*>(__pos) <= _M_get_finish()) && (__data != NULL));
    bool __been_moved = false;  // 解决待插入的元素在原始容器内部并且被移走的问题,false表示待插入的元素不会被移走
    if ((static_cast<const char*>(__data) >= static_cast<const char*>(__pos))
        && (static_cast<const char*>(__data) < _M_get_finish()))
    {
        __been_moved = true;
    }
    __M_finish = _copy_trivial(__pos, _M_get_finish(), static_cast<char*>(__pos) + (__count * __unit_size));
    __data = __been_moved ? (static_cast<const char*>(__data) + (__count * __unit_size)) : __data;
    _fill_n_trivial(__pos, __count, __data, __unit_size);
}
Exemple #7
0
void _VectorBase::_M_push_back(const void* __data, size_t __unit_size)
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (_M_get_end_of_storage() >= _M_get_finish()) && (__data != NULL));
    if (__M_finish != __M_end_of_storage)
    {
        VOS_memcpy_s(__M_finish, __unit_size, __data, __unit_size);
        __M_finish = _M_get_finish() + __unit_size;
    }
    else
    {
        _M_insert_overflow(__M_finish, 1, __data, __unit_size);
    }
}
Exemple #8
0
stringbuf::pos_type stringbuf::seekoff(off_type __off, ios_base::seekdir __dir, ios_base::openmode __mode /* = ios_base::in | ios_base::out */) 
{
    __mode &= __M_mode;
    bool __imode = (__mode & ios_base::in) != 0;
    bool __omode = (__mode & ios_base::out) != 0;

    if ((__imode == false) && (__omode == false)) return pos_type(-1);
    if ((__imode && (gptr() == 0)) || (__omode && (pptr() == 0))) return pos_type(-1);
    STL_ASSERT((eback() <= gptr()) && (gptr() <= egptr()) && (pbase() <= pptr()) && (pptr() <= epptr()));

    streamoff __newoff;
    switch (__dir) 
    {
    case ios_base::beg:
        __newoff = 0;
        break;
    case ios_base::end:
        __newoff = __M_str.size();
        break;
    case ios_base::cur:
        __newoff = __imode ? (gptr() - eback()) : (pptr() - pbase());
        if (__off == 0) return pos_type(__newoff);
        break;
    default:
        return pos_type(-1);
    }

    __off += __newoff;

    if (__imode) 
    {
        ptrdiff_t __size = egptr() - eback();
        if ((__off < 0) || (__off > __size)) return pos_type(-1);
        setg(eback(), eback() + static_cast<ptrdiff_t>(__off), eback() + static_cast<ptrdiff_t>(__size));
    }

    if (__omode) 
    {
        ptrdiff_t __size = epptr() - pbase();
        if ((__off < 0) || (__off > __size)) return pos_type(-1);
        setp(pbase(), pbase() + __size);
        pbump(static_cast<int>(__off));
    }

    return pos_type(__off);
}
Exemple #9
0
void _VectorBase::_M_fill_insert(void* __pos, size_t __count, const void* __data, size_t __unit_size)
{
    STL_ASSERT((static_cast<char*>(__pos) >= _M_get_start()) && (static_cast<char*>(__pos) <= _M_get_finish()) 
               && (_M_get_end_of_storage() >= _M_get_finish()) && (__data != NULL));
    if (__count <= 0)
    {
        return;
    }

    if (static_cast<size_t>(_M_get_end_of_storage() - _M_get_finish()) >= (__count * __unit_size))
    {
        _M_fill_insert_aux(__pos, __count, __data, __unit_size);
    }
    else
    {
        _M_insert_overflow(__pos, __count, __data, __unit_size);
    }
}
Exemple #10
0
bool _VectorBase::operator<(const _VectorBase& __other_vector) const
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (__other_vector._M_get_finish() >= __other_vector._M_get_start()));
    return lexicographical_compare(_M_get_start(), _M_get_finish(), __other_vector._M_get_start(), __other_vector._M_get_finish());
}
Exemple #11
0
bool _VectorBase::operator==(const _VectorBase& __other_vector) const
{
    STL_ASSERT((_M_get_finish() >= _M_get_start()) && (__other_vector._M_get_finish() >= __other_vector._M_get_start()));
    return ((_M_get_finish() - _M_get_start()) == (__other_vector._M_get_finish() - __other_vector._M_get_start()))
           && equal(_M_get_start(), _M_get_finish(), __other_vector._M_get_start());
}