---
tags: codebook
---
{%hackmd theme-dark %}
# iostreambuf
```cpp=
#include<iostream>
#include<streambuf>
#include<cctype>
#include<limits>
using namespace std;
struct istreambuf{
bool eof;streambuf *ib;size_t _last_input;
operator bool(){return !eof;}
//get
inline void tie(int*){return;}
inline int get(){int c=ib->sbumpc();return c;}
inline istreambuf& get(char& c){c=ib->sbumpc();return *this;}
inline size_t gcount(){return _last_input;}
//ignore
inline istreambuf& ignore(size_t n=1,int delim=EOF){
int c=ib->sbumpc();while(n--&&c!=delim&&c!=EOF)c=ib->sbumpc();
if(c==EOF){eof=true;}return *this;}
//getline
inline istreambuf& getline(char* s,size_t n,char delim=EOF){
_last_input=0;char c=ib->sbumpc();
while(c!='\n'&&c!=EOF&&c!=delim&&_last_input!=n){
*(s+_last_input)=c;c=ib->sbumpc();_last_input++;};if(c==EOF){eof=true;}return *this;}
//getline(friend)
friend inline istreambuf& getline(istreambuf& buf,string& str,char delim=EOF){
str.clear();char c=buf.ib->sbumpc();
while(c!='\n'&&c!=EOF&&c!=delim){str.push_back(c);c=buf.ib->sbumpc();}
buf._last_input=str.size();if(c==EOF){buf.eof=true;}return buf;}
//operator>>
inline istreambuf& operator>>(unsigned& re){
re=0;char c=0;while(!isdigit(c)){if(c==EOF){eof=true;return *this;}c=ib->sbumpc();}
if(c==EOF){eof=true;return *this;}
while(isdigit(c)){re=re*10+c-'0',c=ib->sbumpc();}return *this;}
inline istreambuf& operator>>(unsigned long long& re){
re=0;char c=0;while(!isdigit(c)){if(c==EOF){eof=true;return *this;}c=ib->sbumpc();}
while(isdigit(c)){re=re*10+c-'0',c=ib->sbumpc();}return *this;}
inline istreambuf& operator>>(long unsigned& re){
re=0;char c=0;while(!isdigit(c)){if(c==EOF){eof=true;return *this;}c=ib->sbumpc();}
while(isdigit(c)){re=re*10+c-'0',c=ib->sbumpc();}return *this;}
inline istreambuf& operator>>(int& re){
re=0;bool b=false;char c=ib->sbumpc();
while(!isdigit(c)){if(c==EOF){eof=true;return *this;}b=(c=='-'?true:b);c=ib->sbumpc();}
while(isdigit(c)){re=re*10+c-'0',c=ib->sbumpc();}
re=b?-re:re; return *this;}
inline istreambuf& operator>>(long long& re){
re=0;bool b=false;char c=ib->sbumpc();
while(!isdigit(c)){if(c==EOF){eof=true;return *this;}b=(c=='-'?true:b);c=ib->sbumpc();}
while(isdigit(c)){re=re*10+c-'0',c=ib->sbumpc();}
re=b?-re:re;return *this;}
inline istreambuf& operator>>(float& re){cin>>re;return *this;}
inline istreambuf& operator>>(double& re){cin>>re;return *this;}
inline istreambuf& operator>>(long double& re){cin>>re;return *this;}
inline istreambuf& operator>>(string& re){
re.clear();char c=ib->sbumpc();
while(isspace(c)) c=ib->sbumpc();
if(c==EOF){eof=true;return *this;}
while(!isspace(c)){re.push_back(c),c=ib->sbumpc();}
_last_input=re.size();return *this;}
inline istreambuf& operator>>(char& x){
x=ib->sbumpc();while(isspace(x)) x=ib->sbumpc();
if(x==EOF){eof=true;}return *this;}
//constructor
istreambuf(istream& is):eof(false),_last_input(0){is.tie(nullptr);
ios::sync_with_stdio(false);ib=is.rdbuf();}
} ibuf(cin);
struct ostreambuf{
streambuf *ob;
inline void tie(int*){return;}
//write
inline ostreambuf& write(char* s,size_t n){
for(size_t i=0;i!=n;i++){*this<<*(s+i);}return *this;}
//operator<<
inline ostreambuf& operator<<(unsigned x){
if(!x){ob->sputc('0');return *this;}
char tmp[10];int cnt=0;
while(x) tmp[cnt++]=x%10+'0',x/=10;
while(cnt--){ob->sputc(tmp[cnt]);} return *this;}
inline ostreambuf& operator<<(unsigned long long x){
if(!x){ob->sputc('0');return *this;}
char tmp[19];int cnt=0;
while(x) tmp[cnt++]=x%10+'0',x/=10;
while(cnt--){ob->sputc(tmp[cnt]);}return *this;}
inline ostreambuf& operator<<(long unsigned x){
if(!x){ob->sputc('0');return *this;}
char tmp[19];int cnt=0;
while(x) tmp[cnt++]=x%10+'0',x/=10;
while(cnt--){ob->sputc(tmp[cnt]);}return *this;}
inline ostreambuf& operator<<(int x){
if(!x){ob->sputc('0');return *this;}
char tmp[10];int cnt=0;bool b=false;
if(x&numeric_limits<int>::min()) tmp[cnt++]=-(x%10)+'0',x/=-10,b=true;
while(x) tmp[cnt++]=x%10+'0',x/=10;
if(b){ob->sputc('-');}while(cnt--){ob->sputc(tmp[cnt]);}return *this;}
inline ostreambuf& operator<<(long long x){
if(!x){ob->sputc('0');return *this;}
char tmp[19];int cnt=0;bool b=false;
if(x&numeric_limits<long long>::min()) tmp[cnt++]=-(x%10)+'0',x/=-10,b=true;
while(x) tmp[cnt++]=x%10+'0',x/=10;
if(b){ob->sputc('-');}while(cnt--){ob->sputc(tmp[cnt]);}return *this;}
inline ostreambuf& operator<<(const float& x){cout<<x;return *this;}
inline ostreambuf& operator<<(const double& x){cout<<x;return *this;}
inline ostreambuf& operator<<(const long double& x){cout<<x;return *this;}
inline ostreambuf& operator<<(const string& x){ob->sputn(x.data(),x.size());return *this;}
inline ostreambuf& operator<<(char* x){while(*x) ob->sputc(*x),x++;return *this;}
inline ostreambuf& operator<<(char x){ob->sputc(x);return *this;}
inline ostreambuf& operator<<(ostreambuf& (*func)(ostreambuf&)){return (*func)(*this);}
ostreambuf& operator<<(ostream& (*func)(ostream&));
//constructor
ostreambuf(ostream& os){os.tie(nullptr);ios::sync_with_stdio(false);ob=os.rdbuf();}
}obuf(cout);
//global function
inline ostreambuf& _newline(ostreambuf& sb){sb.ob->sputc('\n');return sb;}
//[[deprecated]]
inline ostreambuf& _flush(ostreambuf& sb){cout<<flush;return sb;}
//[[deprecated]]
inline ostreambuf& _newline_flush(ostreambuf& sb){sb.ob->sputc('\n');cout<<flush;return sb;}
inline ostreambuf& ostreambuf::operator<<(ostream& (*func)(ostream&)){return _newline_flush(*this);}
//macro
#define cin ibuf
#define cout obuf
#define newline _newline
#define flush _flush
#define ostream ostreambuf
#define istream istreambuf
```
```cpp=
#include<iostream>
#include<vector>
```
```cpp=
#ifdef _GLIBCXX_IOSTREAM
#include<streambuf>
#include<cctype>
#include<limits>
using namespace std;
struct istreambuf{
bool eof;
streambuf *ib;
size_t _last_input;
operator bool(){return !eof;}
inline void tie(int*){return;}
inline size_t gcount(){return _last_input;}
//get
inline int get(){
int c=ib->sbumpc();
return c;
}
inline istreambuf& get(char& c){
c=ib->sbumpc();
return *this;
}
//ignore
inline istreambuf& ignore(size_t n=1,int delim=EOF){
int c=ib->sbumpc();
while(n--&&c!=delim&&c!=EOF)
c=ib->sbumpc();
if(c==EOF)
eof=true;
return *this;
}
//getline
inline istreambuf& getline(char* s,size_t n,char delim=EOF){
_last_input=0;
char c=ib->sbumpc();
while(c!='\n'&&c!=EOF&&c!=delim&&_last_input!=n){
*(s+_last_input)=c;
c=ib->sbumpc();
_last_input++;
};
if(c==EOF)
eof=true;
return *this;
}
//getline(friend)
friend inline istreambuf& getline(istreambuf& buf,string& str,char delim=EOF){
str.clear();
char c=buf.ib->sbumpc();
while(c!='\n'&&c!=EOF&&c!=delim){
str.push_back(c);
c=buf.ib->sbumpc();
}
buf._last_input=str.size();
if(c==EOF)
buf.eof=true;
return buf;
}
//operator>>
inline istreambuf& operator>>(unsigned& re){
re=0;
char c=0;
while(!isdigit(c)){
if(c==EOF){
eof=true;
return *this;
}
c=ib->sbumpc();
}
if(c==EOF){
eof=true;
return *this;
}
while(isdigit(c))
re=re*10+c-'0',c=ib->sbumpc();
return *this;
}
inline istreambuf& operator>>(unsigned long long& re){
re=0;
char c=0;
while(!isdigit(c)){
if(c==EOF){
eof=true;
return *this;
}
c=ib->sbumpc();
}
while(isdigit(c))
re=re*10+c-'0',c=ib->sbumpc();
return *this;
}
inline istreambuf& operator>>(long unsigned& re){
re=0;
char c=0;
while(!isdigit(c)){
if(c==EOF){
eof=true;
return *this;
}
c=ib->sbumpc();
}
while(isdigit(c))
re=re*10+c-'0',c=ib->sbumpc();
return *this;
}
inline istreambuf& operator>>(int& re){
re=0;
bool b=false;
char c=ib->sbumpc();
while(!isdigit(c)){
if(c==EOF){
eof=true;
return *this;
}
b=(c=='-'?true:b);
c=ib->sbumpc();}
while(isdigit(c))
re=re*10+c-'0',c=ib->sbumpc();
re=b?-re:re;
return *this;
}
inline istreambuf& operator>>(long long& re){
re=0;
bool b=false;
char c=ib->sbumpc();
while(!isdigit(c)){
if(c==EOF){
eof=true;
return *this;
}
b=(c=='-'?true:b);
c=ib->sbumpc();
}
while(isdigit(c))
re=re*10+c-'0',c=ib->sbumpc();
re=b?-re:re;
return *this;
}
inline istreambuf& operator>>(float& re){
cin>>re;
return *this;
}
inline istreambuf& operator>>(double& re){
cin>>re;
return *this;
}
inline istreambuf& operator>>(long double& re){
cin>>re;
return *this;
}
inline istreambuf& operator>>(string& re){
re.clear();
char c=ib->sbumpc();
while(isspace(c))
c=ib->sbumpc();
if(c==EOF){
eof=true;
return *this;
}
while(!isspace(c))
re.push_back(c),c=ib->sbumpc();
_last_input=re.size();
return *this;
}
inline istreambuf& operator>>(char& x){
x=ib->sbumpc();
while(isspace(x))
x=ib->sbumpc();
if(x==EOF)
eof=true;
return *this;
}
//constructor
istreambuf(istream& is):eof(false),_last_input(0){
is.tie(nullptr);
ios::sync_with_stdio(false);
ib=is.rdbuf();
}
} ibuf(cin);
struct ostreambuf{
streambuf *ob;
inline void tie(int*){return;}
//write
inline ostreambuf& write(char* s,size_t n){
for(size_t i=0;i!=n;i++)
*this<<*(s+i);
return *this;
}
//operator<<
inline ostreambuf& operator<<(unsigned x){
if(!x){
ob->sputc('0');
return *this;
}
char tmp[10];
int cnt=0;
while(x)
tmp[cnt++]=x%10+'0',x/=10;
while(cnt--)
ob->sputc(tmp[cnt]);
return *this;
}
inline ostreambuf& operator<<(unsigned long long x){
if(!x){
ob->sputc('0');
return *this;
}
char tmp[19];
int cnt=0;
while(x)
tmp[cnt++]=x%10+'0',x/=10;
while(cnt--)
ob->sputc(tmp[cnt]);
return *this;
}
inline ostreambuf& operator<<(long unsigned x){
if(!x){
ob->sputc('0');
return *this;
}
char tmp[19];
int cnt=0;
while(x)
tmp[cnt++]=x%10+'0',x/=10;
while(cnt--)
ob->sputc(tmp[cnt]);
return *this;
}
inline ostreambuf& operator<<(int x){
if(!x){
ob->sputc('0');
return *this;
}
char tmp[10];
int cnt=0;
bool b=false;
if(x&numeric_limits<int>::min())
tmp[cnt++]=-(x%10)+'0',x/=-10,b=true;
while(x)
tmp[cnt++]=x%10+'0',x/=10;
if(b)
ob->sputc('-');
while(cnt--)
ob->sputc(tmp[cnt]);
return *this;
}
inline ostreambuf& operator<<(long long x){
if(!x){
ob->sputc('0');
return *this;
}
char tmp[19];
int cnt=0;
bool b=false;
if(x&numeric_limits<long long>::min())
tmp[cnt++]=-(x%10)+'0',x/=-10,b=true;
while(x)
tmp[cnt++]=x%10+'0',x/=10;
if(b)
ob->sputc('-');
while(cnt--)
ob->sputc(tmp[cnt]);
return *this;
}
inline ostreambuf& operator<<(const float& x){
cout<<x;
return *this;
}
inline ostreambuf& operator<<(const double& x){
cout<<x;
return *this;
}
inline ostreambuf& operator<<(const long double& x){
cout<<x;
return *this;
}
inline ostreambuf& operator<<(const string& x){
ob->sputn(x.data(),x.size());
return *this;
}
inline ostreambuf& operator<<(char* x){
while(*x) ob->sputc(*x),x++;
return *this;
}
inline ostreambuf& operator<<(char x){
ob->sputc(x);
return *this;
}
inline ostreambuf& operator<<(ostreambuf& (*func)(ostreambuf&)){
return (*func)(*this);
}
ostreambuf& operator<<(ostream& (*func)(ostream&));
//constructor
ostreambuf(ostream& os){
os.tie(nullptr);
ios::sync_with_stdio(false);
ob=os.rdbuf();
}
}obuf(cout);
//global function
inline ostreambuf& _newline(ostreambuf& sb){
sb.ob->sputc('\n');
return sb;
}
//[[deprecated]]
inline ostreambuf& _flush(ostreambuf& sb){
cout<<flush;
return sb;
}
//[[deprecated]]
inline ostreambuf& _newline_flush(ostreambuf& sb){
sb.ob->sputc('\n');
cout<<flush;
return sb;
}
inline ostreambuf& ostreambuf::operator<<(ostream& (*func)(ostream&)){
return _newline_flush(*this);
}
//macro
#define cin ibuf
#define cout obuf
#define newline _newline
#define flush _flush
#define ostream ostreambuf
#define istream istreambuf
#define endl '\n'
#ifdef _GLIBCXX_VECTOR
#include<vector>
template<typename T>
ostream& operator<<(ostream& os,vector<T>& v){
for(const auto& i:v)
os<<i<<' ';
return os;
}
template<typename T>
istream& operator>>(istream& is,vector<T>& v){
for(auto& i:v)
is>>i;
return is;
}
#endif
#endif
```
## rit/wit
```cpp=
#include<iostream>
#include<cctype>
#include<streambuf>
#include<limits>
using namespace std;
inline bool rit(int& re) {
re = 0; bool b = false; char c = cin.rdbuf()->sbumpc();
while (!isdigit(c)) {
if (c == EOF)
return false;
b = (c == '-' ? true : b);
c = cin.rdbuf()->sbumpc();
}
while (isdigit(c))
re = re * 10 + c - '0', c = cin.rdbuf()->sbumpc();
re = b ? -re : re;
return true;
}
inline bool rit(unsigned long long& re) {
re = 0; char c = cin.rdbuf()->sbumpc();
while (!isdigit(c)) {
if (c == EOF)
return false;
c = cin.rdbuf()->sbumpc();
}
while (isdigit(c))
re = re * 10 + c - '0', c = cin.rdbuf()->sbumpc();
return true;
}
inline void wit(int x) {
if (!x) cout.rdbuf()->sputc('0');
char tmp[10]; int cnt = 0; bool b = false;
if (x & numeric_limits<int>::min()) tmp[cnt++] = -(x % 10) + '0', x /= -10, b = true;
while (x) tmp[cnt++] = x % 10 + '0', x /= 10;
if(b) cout.rdbuf()->sputc('-');
while (cnt--) cout.rdbuf()->sputc(tmp[cnt]);
cout.rdbuf()->sputc('\n');
}
inline void wit(unsigned long long x) {
if (!x) cout.rdbuf()->sputc('0');
char tmp[19]; int cnt = 0;
while (x) tmp[cnt++] = x % 10 + '0', x /= 10;
while (cnt--) cout.rdbuf()->sputc(tmp[cnt]);
cout.rdbuf()->sputc('\n');
}
```