- /*
- *=====================================================================================
- *
- *Filename:Frame_Pic.h
- *
- *Description:
- *
- *Version:1.0
- *Created:2009年01月08日15时57分43秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #ifndef_FRAME_PIC_H
- #define_FRAME_PIC_H
- #include<iostream>
- #include"Picture.h"
- usingnamespacestd;
- namespacelwj
- {
- classFrame_Pic:publicP_Node
- {
- friendclassPicture;
- friendPictureframe(constPicture&);
- friendPicturereframe(constPicture&,char,char,char);
- Frame_Pic(constPicture&,char='+',char='|',char='-');
- intheight()const
- {
- returnp.height()+2;
- }
- intwidth()const
- {
- returnp.width()+2;
- }
- voiddisplay(ostream&,int,int)const;
- Picturedoreframe(char,char,char);
- Picturep;
- charcorner;
- charsideborder;
- chartopborder;
- };
- Frame_Pic::
- Frame_Pic(constPicture&pic,charc,chars,chart):
- p(pic),corner(c),sideborder(s),topborder(t)
- {}
- voidFrame_Pic::
- display(ostream&os,introw,intwd)const
- {
- if(row<0||row>=height())//越界
- pad(os,0,wd);
- else
- {
- if(row==0||row==height()-1)//顶框和底框
- {
- os<<corner;
- inti=p.width();
- while(--i>=0)os<<topborder;
- os<<corner;
- }else//内部行
- {
- os<<sideborder;
- p.display(os,row-1,p.width());
- os<<sideborder;
- }
- pad(os,width(),wd);
- }
- }
- PictureFrame_Pic::
- doreframe(charc,chars,chart)
- {
- returnnewFrame_Pic(reframe(this->p,c,s,t),c,s,t);
- }
- Pictureframe(constPicture&pic)
- {
- returnnewFrame_Pic(pic);//使用了隐式转型操作符
- }
- }
- #endif
- /*
- *=====================================================================================
- *
- *Filename:HCat_Pic.h
- *
- *Description:
- *
- *Version:1.0
- *Created:2009年01月08日16时00分54秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #ifndefHCAT_PIC_H
- #defineHCAT_PIC_H
- #include"Picture.h"
- namespacelwj
- {
- classHCat_Pic:publicP_Node
- {
- friendPictureoperator|(constPicture&,constPicture&);
- friendPicturereframe(constPicture&,char,char,char);
- HCat_Pic(constPicture&,constPicture&);
- intheight()const
- {
- returnmax(left.height(),right.height());
- }
- intwidth()const
- {
- returnleft.width()+right.width();
- }
- voiddisplay(ostream&,int,int)const;
- Picturedoreframe(charc,chars,chart)
- {
- returnnewHCat_Pic(reframe(left,c,s,t),
- reframe(right,c,s,t));
- }
- private:
- Pictureleft,right;
- };
- HCat_Pic::
- HCat_Pic(constPicture&l,constPicture&r):
- left(l),right(r)
- {
- }
- voidHCat_Pic::
- display(ostream&os,introw,intwd)const
- {
- left.display(os,row,left.width());
- right.display(os,row,right.width());
- pad(os,width(),wd);
- }
- }
- #endif
- /*
- *=====================================================================================
- *
- *Filename:Picture2.cpp
- *
- *Description:图像处理,实现方案2,cpp沉思录第10章
- *
- *Version:1.0
- *Created:2009年01月08日14时09分56秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #include<iostream>
- #include<string>
- #include"Picture.h"
- usingnamespacestd;
- usingnamespacelwj;
- intmain()
- {
- constchar*cs[]={"hello","world"};
- Picturep(cs,2);
- Pictureq=frame(p);
- cout<<frame(p|(q&p))<<endl;
- cout<<endl<<endl;
- cout<<reframe(frame(p|(q&p)),'^','~','*')<<endl;
- }
- /*
- *=====================================================================================
- *
- *Filename:Picture.cpp
- *
- *Description:
- *
- *Version:1.0
- *Created:2009年01月08日17时27分18秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #include"Picture.h"
- #include"String_Pic.h"
- #include"Frame_Pic.h"
- #include"HCat_Pic.h"
- #include"VCat_Pic.h"
- namespacelwj
- {
- Picture::
- Picture(constchar*const*str,intn):
- p(newString_Pic(str,n))
- {}
- Picture::
- Picture(P_Node*p_node):p(p_node)
- {}
- Picture::
- Picture(constPicture&orig):p(orig.p)
- {
- orig.p->use++;
- }
- Picture::
- ~Picture()
- {
- if(--p->use==0)
- deletep;
- }
- Picture&Picture::
- operator=(constPicture&orig)
- {
- orig.p->use++;
- if(--p->use==0)
- deletep;
- p=orig.p;
- return*this;
- }
- intPicture::
- height()const
- {
- returnp->height();
- }
- intPicture::
- width()const
- {
- returnp->width();
- }
- voidPicture::
- display(ostream&o,intx,inty)const
- {
- p->display(o,x,y);
- }
- ostream&operator<<(ostream&os,constPicture&picture)
- {
- intht=picture.height();
- for(inti=0;i<ht;i++)
- {
- picture.display(os,i,picture.width());
- os<<endl;
- }
- returnos;
- }
- Picturereframe(constPicture&pic,charc,chars,chart)
- {
- returnpic.p->doreframe(c,s,t);
- }
- Pictureoperator|(constPicture&l,constPicture&r)
- {
- returnnewHCat_Pic(l,r);
- }
- Pictureoperator&(constPicture&t,constPicture&b)
- {
- returnnewVCat_Pic(t,b);
- }
- }
- /*
- *=====================================================================================
- *
- *Filename:Picture.h
- *
- *Description:第二次实现时候,每个类分开写
- *
- *Version:1.0
- *Created:2009年01月08日15时51分33秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #ifndef_PICTURE_H
- #define_PICTURE_H
- #include<iostream>
- usingnamespacestd;
- namespacelwj
- {
- classP_Node;
- classPicture
- {
- friendostream&operator<<(ostream&,constPicture&);
- friendPictureframe(constPicture&);
- friendPictureoperator&(constPicture&,constPicture&);
- friendPictureoperator|(constPicture&,constPicture&);
- friendPicturereframe(constPicture&,char,char,char);
- friendclassString_Pic;
- friendclassFrame_Pic;
- friendclassHCat_Pic;
- friendclassVCat_Pic;
- public:
- Picture();
- Picture(constchar*const*,int);
- Picture(constPicture&);
- ~Picture();
- Picture&operator=(constPicture&);
- private:
- Picture(P_Node*);
- intheight()const;
- intwidth()const;
- voiddisplay(ostream&o,intx,inty)const;
- P_Node*p;
- };
- classP_Node
- {
- friendclassPicture;
- friendPicturereframe(constPicture&,char,char,char);
- protected:
- P_Node():use(1){}
- virtual~P_Node(){}
- virtualintheight()const=0;
- virtualintwidth()const=0;
- virtualvoiddisplay(ostream&,int,int)const=0;
- virtualPicturedoreframe(char,char,char)=0;
- intmax(intx,inty)const
- {
- returnx>y?x:y;
- }
- intuse;//引用计数,每个P_Node可以对应多个Picture
- };
- staticvoidpad(ostream&os,intx,inty)
- {
- for(inti=x;i<y;i++)
- os<<"";
- }
- }
- #endif
- /*
- *=====================================================================================
- *
- *Filename:String_Pic.h
- *
- *Description:
- *
- *Version:1.0
- *Created:2009年01月08日15时55分38秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #ifndef_STRING_PIC_H
- #define_STRING_PIC_H
- #include"Picture.h"
- namespacelwj
- {
- classString_Pic:publicP_Node
- {
- friendclassPicture;
- String_Pic(constchar*const*,int);
- ~String_Pic(){}
- intheight()const
- {
- returnsize;
- }
- intwidth()const
- {
- intn=0;
- for(inti=0;i<size;i++)
- n=P_Node::max(n,strlen(data[i]));
- returnn;
- }
- voiddisplay(ostream&,int,int)const;
- Picturedoreframe(char,char,char)
- {
- use++;
- returnthis;
- }
- char**data;
- intsize;
- };
- String_Pic::
- String_Pic(constchar*const*p,intn):
- data(newchar*[n]),size(n)
- {
- for(inti=0;i<n;i++)
- {
- data[i]=newchar[strlen(p[i])+1];
- strcpy(data[i],p[i]);
- }
- }
- voidString_Pic::
- display(ostream&os,introw,intwidth)const
- {
- intstart=0;
- if(row>=0&&row<height())
- {
- os<<data[row];
- start=strlen(data[row]);
- }
- pad(os,start,width);
- }
- }
- #endif
- /*
- *=====================================================================================
- *
- *Filename:VCat_Pic.h
- *
- *Description:
- *
- *Version:1.0
- *Created:2009年01月08日15时59分07秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #ifndef_VCAT_PIC_H
- #define_VCAT_PIC_H
- #include"Picture.h"
- namespacelwj
- {
- classVCat_Pic:publicP_Node
- {
- friendPictureoperator&(constPicture&,constPicture&);
- friendPicturereframe(constPicture&,char,char,char);
- friendclassPicture;
- VCat_Pic(constPicture&,constPicture&);
- intheight()const
- {
- returntop.height()+bottom.height();
- }
- intwidth()const
- {
- returnmax(top.width(),bottom.width());
- }
- voiddisplay(ostream&,int,int)const;
- Picturedoreframe(charc,chars,chart)
- {
- returnnewVCat_Pic(reframe(top,c,s,t),
- reframe(bottom,c,s,t));
- }
- Picturetop,bottom;
- };
- VCat_Pic::
- VCat_Pic(constPicture&t,constPicture&b):
- top(t),bottom(b)
- {}
- voidVCat_Pic::
- display(ostream&os,introw,intwd)const
- {
- if(row>=0&&row<top.height())
- top.display(os,row,wd);
- elseif(row<top.height()+bottom.height())
- bottom.display(os,row-top.height(),wd);
- else
- pad(os,0,wd);
- }
- }
- #endif