事情起因于打算写一个默认的接口实现,里边什么也不做而是直接返回以尽快让程序编译通过,这个接口的实现是dummy的,什么也不干。
因为原来的接口是OO风格的纯虚函数,需要做的工作就是所有的函数继承过来做一个空实现。
头文件是好办了,直接cp过来,然后加一个类继承声明,并把名字替换掉,
virtual function()=0;
后边的“=0”替换就可以了,用正则替换很容易做到了。
对CPP而言,第一步的办法首先是把所有的声明拷贝过来然后再做变换了:
cat DefaultMediaInterface.h | sed -e 's//s/+/(virtual.*/)//1/'| awk -F 'virtual' '{if (NF>=2) {print $0} }'
virtual ~DefaultMediaInterface(){}
virtual int setVolume(int volume);
virtual int setMicrophoneGain(int gain);
virtual int muteMicrophone(bool mute = true);
virtual int setAudioAECMode(bool enable = true);
virtual int enableAGC(bool enable = true);
virtual int enableAudioNoiseReduction(bool enable = true);
virtual int playAudio(const char* filePath, bool repeat, bool remoteOnly,
virtual int stopAudio();
virtual int playBuffer(const char* data, size_t len, int rate, int type,
virtual int startTone(const resip::Data& toneid, bool local, bool remote);
virtual int stopTone();
virtual int createPlayer(StreamPlayer** player, const char* url, int flag);
virtual ~DefaultMediaManipInterface(){};
virtual int enumerateCodecsSdp(sdpcontainer::SdpCodec**);
virtual int applyInputMixWegiths(int port, MpBridgeGain* inputs, int len);
virtual int applyOutputMixWeights(int port, MpBridgeGain* outputs, int len);
virtual int getResourceInputBridgePort(BridgeInputType type, int* port);
virtual int startRtpSend(int connId, sdpcontainer::SdpCodec** codecs, int codecNum);
virtual bool isSendingRtpMedia(int connId);
virtual int stopRtpSend(int connId);
virtual int startRtpReceive(int connId, sdpcontainer::SdpCodec** codecs, int codecNum);
virtual bool isReceivingRtpMedia(int connId);
virtual int stopRtpReceive(int connId);
virtual int createConnection(int connId, flowmanager::Flow* rtpFlow, flowmanager::Flow* rtcpFlow, bool flag/*MYTODO*/);
virtual int createConnectionNoFlow(int connId, const char* addr, unsigned short port);
virtual int getConnectionBridgePort(int connId, int* port);
virtual int checkConnCodecSupported(int connId);
virtual int deleteConnection(int connId);
将这个输出先重定向到cpp, 然后在里边模式替换好了:
%s/virtual/s/+/(/w/+/)/s/+/(/w/+/s/?(.*)/);//1 ClassName::/2/r{/rreturn 0;/r}/r/gc
思想是比较简单的,以virtual 开头,接下去返回值,函数原型声明,替换为
返回值 类名 :: 原型声明
{
return 0;
}
这样就简单的实现了批量将声明转换成了实现,里边实现的是一个简单的 { return 0; }语句。
大批量的这种替换,省下的工作量还是可观的。
PS:一个可能存在的问题是, 如果函数声明成了两行,那么会漏掉一部分,不过无伤大碍,各个击破即可。