std::basic_...buf::seekpos(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

okay so this is std::basic_...buf::seekpos(3), straight outta the C++ Standard Libary, and it's giving very niche, very protected, very virtual energy πŸ’…βœ¨

πŸŽ€ NAME πŸŽ€

std::basic_stringbuf::seekpos - std::basic_stringbuf::seekpos β€” yes bestie, the name is literally the same twice, iconic πŸ’–

✨ SYNOPSIS ✨

protected:

virtual pos_type seekpos( pos_type sp,
                          std::ios_base::openmode which =
                              std::ios_base::in |
                              std::ios_base::out );

So what does it do? It repositions std::basic_streambuf::gptr and/or std::basic_streambuf::pptr, if possible, to the position indicated by sp.

It effectively executes seekoff(off_type(sp), std::ios_base::beg, which). no cap 🫢

🌸 PARAMETERS 🌸

  • sp β€” stream position, such as one obtained by seekoff() or seekpos().
  • which β€” defines whether the input sequences, the output sequence, or both are affected. It can be one or a combination of the following constants:
    • in β€” affect the input sequence.
    • out β€” affect the output sequence.

🫢 RETURN VALUE 🫢

sp on success or pos_type(off_type(-1)) on failure.

That's the whole vibe: success slays, failure gives negative-one energy πŸ˜­πŸ’€

🧚 NOTES 🧚

seekpos() is called by std::basic_streambuf::pubseekpos(), which is called by the single-argument versions of std::basic_istream::seekg() and std::basic_ostream::seekp(). periodt πŸ’…

πŸ’» EXAMPLE πŸ’»

// Run this code

#include <sstream>
#include <iostream>

struct mybuf : std::stringbuf
{
    mybuf(const std::string& str) : std::stringbuf(str) {}

    pos_type seekpos(pos_type sp, std::ios_base::openmode which)
    {
        std::cout << "Before seekpos(" << sp << "), size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";

        pos_type rc = std::stringbuf::seekpos(sp, which);

        std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                  << "size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";

        return rc;
    }
};

int main()
{
    mybuf buf("12345");
    std::iostream stream(&buf);
    stream.seekg(2);
}

🌈 OUTPUT 🌈

Before seekpos(2), size of the get area is 5 with 5 read positions available.
seekpos() returns 2.
After the call, size of the get area is 5 with 3 read positions available.

πŸ’€ DEFECT REPORTS πŸ’€

The following behavior-changing defect reports were applied retroactively to previously published C++ standards. history really said "we'll fix it later" and then did πŸ’…

  • LWG 375, applied to C++98 β€” static constant members of std::ios_base were misspecified as members of std::basic_ios; corrected.
  • LWG 564, applied to C++98 β€” it was unclear how to reposition gptr and/or pptr; they are repositioned by seekoff().

πŸ‘€ SEE ALSO πŸ‘€

  • pubseekpos β€” invokes seekpos() (public member function of std::basic_streambuf<CharT,Traits>).
  • seekoff [virtual] β€” repositions the next pointer in the input sequence, output sequence, or both, using relative addressing (virtual protected member function).
  • seekpos [virtual] β€” repositions the file position, using absolute addressing (virtual protected member function of std::basic_filebuf<CharT,Traits>).
  • seekpos [virtual] β€” repositions the next pointer in the input sequence, output sequence, or both using absolute addressing (virtual protected member function of std::strstreambuf).

cute little sign-off bestie: this page came from http://cppreference.com, version 2024.06.10, and it's the std::basic_...buf::seekpos(3) manual page. bye and go reposition something πŸ’–πŸ¦‹

πŸ“¦ where this page comes from