summaryrefslogtreecommitdiffstats
path: root/src/classdef.cpp
blob: 58be2bb73bed4aaa1b1bdbc2b91fd6d0b09e0a04 (plain)
1
2
3
4if(bA>0){if(bv!=="border"){for(;bx<e;bx++){if(!bv){bA-=parseFloat(b.css(by,"padding"+bz[bx]))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}else{bA-=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}}}return bA+"px"}bA=Z(by,bw,bw);if(bA<0||bA==null){bA=by.style[bw]||0}bA=parseFloat(bA)||0;if(bv){for(;bx<e;bx++){bA+=parseFloat(b.css(by,"padding"+bz[bx]))||0;if(bv!=="padding"){bA+=parseFloat(b.css(by,"border"+bz[bx]+"Width"))||0}if(bv==="margin"){bA+=parseFloat(b.css(by,bv+bz[bx]))||0}}}return bA+"px"}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aZ=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aM=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aQ=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a6=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw<bz;bw++){bv=bx[bw];bC=/^\+/.test(bv);if(bC){bv=bv.substr(1)||"*"}bB=e[bv]=e[bv]||[];bB[bC?"unshift":"push"](bA)}}}}function aW(bv,bE,bz,bD,bB,bx){bB=bB||bE.dataTypes[0];bx=bx||{};bx[bB]=true;var bA=bv[bB],bw=0,e=bA?bA.length:0,by=(bv===aa),bC;for(;bw<e&&(by||!bC);bw++){bC=bA[bw](bE,bz,bD);if(typeof bC==="string"){if(!by||bx[bC]){bC=L}else{bE.dataTypes.unshift(bC);bC=aW(bv,bE,bz,bD,bC,bx)}}}if((by||!bC)&&!bx["*"]){bC=aW(bv,bE,bz,bD,"*",bx)}return bC}function am(bw,bx){var bv,e,by=b.ajaxSettings.flatOptions||{};for(bv in bx){if(bx[bv]!==L){(by[bv]?bw:(e||(e={})))[bv]=bx[bv]}}if(e){b.extend(true,bw,e)}}b.fn.extend({load:function(bw,bz,bA){if(typeof bw!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var by=bw.indexOf(" ");if(by>=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("<div>").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA<bw;bA++){if(bA===1){for(bE in bH.converters){if(typeof bE==="string"){bG[bE.toLowerCase()]=bH.converters[bE]}}}bx=bC;bC=bD[bA];if(bC==="*"){bC=bx}else{if(bx!=="*"&&bx!==bC){by=bx+" "+bC;bF=bG[by]||bG["* "+bC];if(!bF){e=L;for(bv in bG){bB=bv.split(" ");if(bB[0]===bx||bB[0]==="*"){e=bG[bB[1]+" "+bC];if(e){bv=bG[bv];if(bv===true){bF=e}else{if(e===true){bF=bv}}break}}}}if(!(bF||e)){b.error("No conversion from "+by.replace(" "," to "))}if(bF!==true){bz=bF?bF(bz):e(bv(bz))}}}}return bz}var aC=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(aC++)}});b.ajaxPrefilter("json jsonp",function(bD,bA,bC){var bx=bD.contentType==="application/x-www-form-urlencoded"&&(typeof bD.data==="string");if(bD.dataTypes[0]==="jsonp"||bD.jsonp!==false&&(u.test(bD.url)||bx&&u.test(bD.data))){var bB,bw=bD.jsonpCallback=b.isFunction(bD.jsonpCallback)?bD.jsonpCallback():bD.jsonpCallback,bz=bb[bw],e=bD.url,by=bD.data,bv="$1"+bw+"$2";if(bD.jsonp!==false){e=e.replace(u,bv);if(bD.url===e){if(bx){by=by.replace(u,bv)}if(bD.data===by){e+=(/\?/.test(e)?"&":"?")+bD.jsonp+"="+bw}}}bD.url=e;bD.data=by;bb[bw]=function(bE){bB=[bE]};bC.always(function(){bb[bw]=bz;if(bB&&b.isFunction(bz)){bb[bw](bB[0])}});bD.converters["script json"]=function(){if(!bB){b.error(bw+" was not called")}return bB[0]};bD.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===L){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bw){if(bw.crossDomain){var e,bv=av.head||av.getElementsByTagName("head")[0]||av.documentElement;return{send:function(bx,by){e=av.createElement("script");e.async="async";if(bw.scriptCharset){e.charset=bw.scriptCharset}e.src=bw.url;e.onload=e.onreadystatechange=function(bA,bz){if(bz||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bv&&e.parentNode){bv.removeChild(e)}e=L;if(!bz){by(200,"success")}}};bv.insertBefore(e,bv.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var B=bb.ActiveXObject?function(){for(var e in N){N[e](0,1)}}:false,y=0,N;function aL(){try{return new bb.XMLHttpRequest()}catch(bv){}}function aj(){try{return new bb.ActiveXObject("Microsoft.XMLHTTP")}catch(bv){}}b.ajaxSettings.xhr=bb.ActiveXObject?function(){return !this.isLocal&&aL()||aj()}:aL;(function(e){b.extend(b.support,{ajax:!!e,cors:!!e&&("withCredentials" in e)})})(b.ajaxSettings.xhr());if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bv;return{send:function(bB,bw){var bA=e.xhr(),bz,by;if(e.username){bA.open(e.type,e.url,e.async,e.username,e.password)}else{bA.open(e.type,e.url,e.async)}if(e.xhrFields){for(by in e.xhrFields){bA[by]=e.xhrFields[by]}}if(e.mimeType&&bA.overrideMimeType){bA.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bB["X-Requested-With"]){bB["X-Requested-With"]="XMLHttpRequest"}try{for(by in bB){bA.setRequestHeader(by,bB[by])}}catch(bx){}bA.send((e.hasContent&&e.data)||null);bv=function(bK,bE){var bF,bD,bC,bI,bH;try{if(bv&&(bE||bA.readyState===4)){bv=L;if(bz){bA.onreadystatechange=b.noop;if(B){delete N[bz]}}if(bE){if(bA.readyState!==4){bA.abort()}}else{bF=bA.status;bC=bA.getAllResponseHeaders();bI={};bH=bA.responseXML;if(bH&&bH.documentElement){bI.xml=bH}bI.text=bA.responseText;try{bD=bA.statusText}catch(bJ){bD=""}if(!bF&&e.isLocal&&!e.crossDomain){bF=bI.text?200:404}else{if(bF===1223){bF=204}}}}}catch(bG){if(!bE){bw(-1,bG)}}if(bI){bw(bF,bD,bI,bC)}};if(!e.async||bA.readyState===4){bv()}else{bz=++y;if(B){if(!N){N={};b(bb).unload(B)}N[bz]=bv}bA.onreadystatechange=bv}},abort:function(){if(bv){bv(0,1)
}}}}})}var Q={},a8,m,aB=/^(?:toggle|show|hide)$/,aT=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,a3,aH=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],a4;b.fn.extend({show:function(bx,bA,bz){var bw,by;if(bx||bx===0){return this.animate(a0("show",3),bx,bA,bz)}else{for(var bv=0,e=this.length;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(!b._data(bw,"olddisplay")&&by==="none"){by=bw.style.display=""}if(by===""&&b.css(bw,"display")==="none"){b._data(bw,"olddisplay",x(bw.nodeName))}}}for(bv=0;bv<e;bv++){bw=this[bv];if(bw.style){by=bw.style.display;if(by===""||by==="none"){bw.style.display=b._data(bw,"olddisplay")||""}}}return this}},hide:function(bx,bA,bz){if(bx||bx===0){return this.animate(a0("hide",3),bx,bA,bz)}else{var bw,by,bv=0,e=this.length;for(;bv<e;bv++){bw=this[bv];if(bw.style){by=b.css(bw,"display");if(by!=="none"&&!b._data(bw,"olddisplay")){b._data(bw,"olddisplay",by)}}}for(bv=0;bv<e;bv++){if(this[bv].style){this[bv].style.display="none"}}return this}},_toggle:b.fn.toggle,toggle:function(bw,bv,bx){var e=typeof bw==="boolean";if(b.isFunction(bw)&&b.isFunction(bv)){this._toggle.apply(this,arguments)}else{if(bw==null||e){this.each(function(){var by=e?bw:b(this).is(":hidden");b(this)[by?"show":"hide"]()})}else{this.animate(a0("toggle",3),bw,bv,bx)}}return this},fadeTo:function(e,bx,bw,bv){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bx},e,bw,bv)},animate:function(bz,bw,by,bx){var e=b.speed(bw,by,bx);if(b.isEmptyObject(bz)){return this.each(e.complete,[false])}bz=b.extend({},bz);function bv(){if(e.queue===false){b._mark(this)}var bE=b.extend({},e),bK=this.nodeType===1,bI=bK&&b(this).is(":hidden"),bB,bF,bD,bJ,bH,bC,bG,bL,bA;bE.animatedProperties={};for(bD in bz){bB=b.camelCase(bD);if(bD!==bB){bz[bB]=bz[bD];delete bz[bD]}bF=bz[bB];if(b.isArray(bF)){bE.animatedProperties[bB]=bF[1];bF=bz[bB]=bF[0]}else{bE.animatedProperties[bB]=bE.specialEasing&&bE.specialEasing[bB]||bE.easing||"swing"}if(bF==="hide"&&bI||bF==="show"&&!bI){return bE.complete.call(this)}if(bK&&(bB==="height"||bB==="width")){bE.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout||x(this.nodeName)==="inline"){this.style.display="inline-block"}else{this.style.zoom=1}}}}if(bE.overflow!=null){this.style.overflow="hidden"}for(bD in bz){bJ=new b.fx(this,bE,bD);bF=bz[bD];if(aB.test(bF)){bA=b._data(this,"toggle"+bD)||(bF==="toggle"?bI?"show":"hide":0);if(bA){b._data(this,"toggle"+bD,bA==="show"?"hide":"show");bJ[bA]()}else{bJ[bF]()}}else{bH=aT.exec(bF);bC=bJ.cur();if(bH){bG=parseFloat(bH[2]);bL=bH[3]||(b.cssNumber[bD]?"":"px");if(bL!=="px"){b.style(this,bD,(bG||1)+bL);bC=((bG||1)/bJ.cur())*bC;b.style(this,bD,bC+bL)}if(bH[1]){bG=((bH[1]==="-="?-1:1)*bG)+bC}bJ.custom(bC,bG,bL)}else{bJ.custom(bC,bF,"")}}}return true}return e.queue===false?this.each(bv):this.queue(e.queue,bv)},stop:function(bw,bv,e){if(typeof bw!=="string"){e=bv;bv=bw;bw=L}if(bv&&bw!==false){this.queue(bw||"fx",[])}return this.each(function(){var bx,by=false,bA=b.timers,bz=b._data(this);if(!e){b._unmark(true,this)}function bB(bE,bF,bD){var bC=bF[bD];b.removeData(bE,bD,true);bC.stop(e)}if(bw==null){for(bx in bz){if(bz[bx]&&bz[bx].stop&&bx.indexOf(".run")===bx.length-4){bB(this,bz,bx)}}}else{if(bz[bx=bw+".run"]&&bz[bx].stop){bB(this,bz,bx)}}for(bx=bA.length;bx--;){if(bA[bx].elem===this&&(bw==null||bA[bx].queue===bw)){if(e){bA[bx](true)}else{bA[bx].saveState()}by=true;bA.splice(bx,1)}}if(!(e&&by)){b.dequeue(this,bw)}})}});function bh(){setTimeout(at,0);return(a4=b.now())}function at(){a4=L}function a0(bv,e){var bw={};b.each(aH.concat.apply([],aH.slice(0,e)),function(){bw[this]=bv});return bw}b.each({slideDown:a0("show",1),slideUp:a0("hide",1),slideToggle:a0("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bv){b.fn[e]=function(bw,by,bx){return this.animate(bv,bw,by,bx)}});b.extend({speed:function(bw,bx,bv){var e=bw&&typeof bw==="object"?b.extend({},bw):{complete:bv||!bv&&bx||b.isFunction(bw)&&bw,duration:bw,easing:bv&&bx||bx&&!b.isFunction(bx)&&bx};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;if(e.queue==null||e.queue===true){e.queue="fx"}e.old=e.complete;e.complete=function(by){if(b.isFunction(e.old)){e.old.call(this)}if(e.queue){b.dequeue(this,e.queue)}else{if(by!==false){b._unmark(this)}}};return e},easing:{linear:function(bw,bx,e,bv){return e+bv*bw},swing:function(bw,bx,e,bv){return((-Math.cos(bw*Math.PI)/2)+0.5)*bv+e}},timers:[],fx:function(bv,e,bw){this.options=e;this.elem=bv;this.prop=bw;e.orig=e.orig||{}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bv=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bv))?!bv||bv==="auto"?0:bv:e},custom:function(bz,by,bx){var e=this,bw=b.fx;this.startTime=a4||bh();this.end=by;this.now=this.start=bz;this.pos=this.state=0;this.unit=bx||this.unit||(b.cssNumber[this.prop]?"":"px");function bv(bA){return e.step(bA)}bv.queue=this.options.queue;bv.elem=this.elem;bv.saveState=function(){if(e.options.hide&&b._data(e.elem,"fxshow"+e.prop)===L){b._data(e.elem,"fxshow"+e.prop,e.start)}};if(bv()&&b.timers.push(bv)&&!a3){a3=setInterval(bw.tick,bw.interval)}},show:function(){var e=b._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||b.style(this.elem,this.prop);this.options.show=true;if(e!==L){this.custom(this.cur(),e)}else{this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur())}b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b._data(this.elem,"fxshow"+this.prop)||b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(by){var bA,bB,bv,bx=a4||bh(),e=true,bz=this.elem,bw=this.options;if(by||bx>=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e<bv.length;e++){bw=bv[e];if(!bw()&&bv[e]===bw){bv.splice(e--,1)}}if(!bv.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(a3);a3=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=e.now+e.unit}else{e.elem[e.prop]=e.now}}}});b.each(["width","height"],function(e,bv){b.fx.step[bv]=function(bw){b.style(bw.elem,bv,Math.max(0,bw.now)+bw.unit)}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bv){return e===bv.elem}).length}}function x(bx){if(!Q[bx]){var e=av.body,bv=b("<"+bx+">").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b
})}})(window);
"hl com"> * dictionary is the template argument list. */ QDict<ClassDef> *variableInstances; QDict<int> *templBaseClassNames; /*! The class this class is an instance of. */ ClassDef *templateMaster; /*! class name with outer class scope, but without namespace scope. */ QCString className; /*! If this class is a Objective-C category, then this points to the * class which is extended. */ ClassDef *categoryOf; QList<MemberList> memberLists; /* user defined member groups */ MemberGroupSDict *memberGroupSDict; /*! Indicated whether this class exists because it is used by * some other class only (TRUE) or if some class inherits from * it (FALSE). This is need to remove used-only classes from * the inheritance tree. */ bool artificial; /*! Is this an abstact class? */ bool isAbstract; /*! Is the class part of an unnamed namespace? */ bool isStatic; /*! Is the class part implemented in Objective C? */ bool isObjC; /*! TRUE if classes members are merged with those of the base classes. */ bool membersMerged; /*! TRUE if the class is defined in a source file rather than a header file. */ bool isLocal; bool isTemplArg; /*! Does this class group its user-grouped members * as a sub-section of the normal (public/protected/..) * groups? */ bool subGrouping; bool usedOnly; }; void ClassDefImpl::init(const char *defFileName, const char *name, const QCString &ctStr, const char *fName) { if (fName) { fileName=stripExtension(fName); } else { fileName=ctStr+name; } exampleSDict = 0; inherits = 0; inheritedBy = 0; allMemberNameInfoSDict = 0; incInfo=0; tempArgs=0; typeConstraints=0; prot=Public; nspace=0; fileDef=0; usesImplClassDict=0; usedByImplClassDict=0; usesIntfClassDict=0; memberGroupSDict = 0; innerClasses = 0; subGrouping=Config_getBool("SUBGROUPING"); templateInstances = 0; variableInstances = 0; templateMaster =0; templBaseClassNames = 0; artificial = FALSE; isAbstract = FALSE; isStatic = FALSE; isTemplArg = FALSE; membersMerged = FALSE; categoryOf = 0; usedOnly = FALSE; QCString ns; extractNamespaceName(name,className,ns); //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data()); if (((QCString)defFileName).right(5)!=".java" && guessSection(defFileName)==Entry::SOURCE_SEC) { isLocal=TRUE; } else { isLocal=FALSE; } } ClassDefImpl::ClassDefImpl() { } ClassDefImpl::~ClassDefImpl() { delete inherits; delete inheritedBy; delete allMemberNameInfoSDict; delete exampleSDict; delete usesImplClassDict; delete usedByImplClassDict; delete usesIntfClassDict; delete incInfo; delete memberGroupSDict; delete innerClasses; delete templateInstances; delete variableInstances; delete templBaseClassNames; delete tempArgs; delete typeConstraints; } // constructs a new class definition ClassDef::ClassDef( const char *defFileName,int defLine, const char *nm,CompoundType ct, const char *lref,const char *fName, bool isSymbol) : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm),0,0,isSymbol) { visited=FALSE; setReference(lref); m_impl = new ClassDefImpl; m_impl->compType = ct; m_impl->isObjC = FALSE; m_impl->init(defFileName,name(),compoundTypeString(),fName); } // destroy the class definition ClassDef::~ClassDef() { delete m_impl; } QCString ClassDef::getMemberListFileName() const { return convertNameToFile(compoundTypeString()+name()+"-members"); } QCString ClassDef::displayName() const { static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES"); static bool optimizeOutputForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); QCString n; if (hideScopeNames) { n=m_impl->className; } else { n=qualifiedNameWithTemplateParameters(); } if (optimizeOutputForJava) { n=substitute(n,"::","."); } if (m_impl->compType==ClassDef::Protocol && n.right(2)=="-p") { n="< "+n.left(n.length()-2)+" >"; } return n; } // inserts a base class in the inheritance list void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p, Specifier s,const char *t) { //printf("*** insert base class %s into %s\n",cd->name().data(),name().data()); //inherits->inSort(new BaseClassDef(cd,p,s,t)); if (m_impl->inherits==0) { m_impl->inherits = new BaseClassList; m_impl->inherits->setAutoDelete(TRUE); } m_impl->inherits->append(new BaseClassDef(cd,n,p,s,t)); } // inserts a sub class in the inherited list void ClassDef::insertSubClass(ClassDef *cd,Protection p, Specifier s,const char *t) { //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data()); if (m_impl->inheritedBy==0) { m_impl->inheritedBy = new BaseClassList; m_impl->inheritedBy->setAutoDelete(TRUE); } m_impl->inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t)); } void ClassDef::addMembersToMemberGroup() { QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if ((ml->listType()&MemberList::detailedLists)==0) { ::addMembersToMemberGroup(ml,&m_impl->memberGroupSDict,this); } } // add members inside sections to their groups if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { if (mg->allMembersInSameSection() && m_impl->subGrouping) { //printf("addToDeclarationSection(%s)\n",mg->header().data()); mg->addToDeclarationSection(); } } } } // adds new member definition to the class void ClassDef::internalInsertMember(MemberDef *md, Protection prot, bool addToAllList ) { if (md->isHidden()) return; //printf("adding %s::%s\n",name().data(),md->name().data()); if (!isReference()) { static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); /********************************************/ /* insert member in the declaration section */ /********************************************/ if (md->isRelated() && (extractPrivate || prot!=Private)) { addMemberToList(MemberList::related,md); } else if (md->isFriend()) { addMemberToList(MemberList::friends,md); } else { switch (md->memberType()) { case MemberDef::Signal: // Qt specific addMemberToList(MemberList::signals,md); break; case MemberDef::DCOP: // KDE2 specific addMemberToList(MemberList::dcopMethods,md); break; case MemberDef::Property: addMemberToList(MemberList::properties,md); break; case MemberDef::Event: addMemberToList(MemberList::events,md); break; case MemberDef::Slot: // Qt specific switch (prot) { case Protected: case Package: // slots in packages are not possible! addMemberToList(MemberList::proSlots,md); break; case Public: addMemberToList(MemberList::pubSlots,md); break; case Private: addMemberToList(MemberList::priSlots,md); break; } break; default: // any of the other members if (md->isStatic()) { if (md->isVariable()) { switch (prot) { case Protected: addMemberToList(MemberList::proStaticAttribs,md); break; case Package: addMemberToList(MemberList::pacStaticAttribs,md); break; case Public: addMemberToList(MemberList::pubStaticAttribs,md); break; case Private: addMemberToList(MemberList::priStaticAttribs,md); break; } } else // function { switch (prot) { case Protected: addMemberToList(MemberList::proStaticMethods,md); break; case Package: addMemberToList(MemberList::pacStaticMethods,md); break; case Public: addMemberToList(MemberList::pubStaticMethods,md); break; case Private: addMemberToList(MemberList::priStaticMethods,md); break; } } } else // not static { if (md->isVariable()) { switch (prot) { case Protected: addMemberToList(MemberList::proAttribs,md); break; case Package: addMemberToList(MemberList::pacAttribs,md); break; case Public: addMemberToList(MemberList::pubAttribs,md); break; case Private: addMemberToList(MemberList::priAttribs,md); break; } } else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue()) { switch (prot) { case Protected: addMemberToList(MemberList::proTypes,md); break; case Package: addMemberToList(MemberList::pacTypes,md); break; case Public: addMemberToList(MemberList::pubTypes,md); break; case Private: addMemberToList(MemberList::priTypes,md); break; } } else // member function { switch (prot) { case Protected: addMemberToList(MemberList::proMethods,md); break; case Package: addMemberToList(MemberList::pacMethods,md); break; case Public: addMemberToList(MemberList::pubMethods,md); break; case Private: addMemberToList(MemberList::priMethods,md); break; } } } break; } } /*******************************************************/ /* insert member in the detailed documentation section */ /*******************************************************/ if ((md->isRelated() && (extractPrivate || prot!=Private)) || md->isFriend()) { addMemberToList(MemberList::relatedMembers,md); } else { switch (md->memberType()) { case MemberDef::Property: addMemberToList(MemberList::propertyMembers,md); break; case MemberDef::Event: addMemberToList(MemberList::eventMembers,md); break; case MemberDef::Signal: // fall through case MemberDef::DCOP: addMemberToList(MemberList::functionMembers,md); break; case MemberDef::Slot: switch (prot) { case Protected: case Package: case Public: addMemberToList(MemberList::functionMembers,md); break; case Private: if (extractPrivate) { addMemberToList(MemberList::functionMembers,md); } break; } break; default: // any of the other members if (prot!=Private || extractPrivate) { switch (md->memberType()) { case MemberDef::Typedef: addMemberToList(MemberList::typedefMembers,md); break; case MemberDef::Enumeration: addMemberToList(MemberList::enumMembers,md); break; case MemberDef::EnumValue: addMemberToList(MemberList::enumValMembers,md); break; case MemberDef::Function: if (md->isConstructor() || md->isDestructor()) { MemberList *ml = createMemberList(MemberList::constructors); ml->append(md); } else { addMemberToList(MemberList::functionMembers,md); } break; case MemberDef::Variable: addMemberToList(MemberList::variableMembers,md); break; default: err("Unexpected member type %d found!\n",md->memberType()); } } break; } } /*************************************************/ /* insert member in the appropriate member group */ /*************************************************/ // Note: this must be done AFTER inserting the member in the // regular groups //addMemberToGroup(md,groupId); } if (md->virtualness()==Pure) { m_impl->isAbstract=TRUE; } //::addClassMemberNameToIndex(md); if (addToAllList && !(Config_getBool("HIDE_FRIEND_COMPOUNDS") && md->isFriend() && (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"))) { //printf("=======> adding member %s to class %s\n",md->name().data(),name().data()); MemberInfo *mi = new MemberInfo((MemberDef *)md, prot,md->virtualness(),FALSE); MemberNameInfo *mni=0; if (m_impl->allMemberNameInfoSDict==0) { m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17); m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE); } if ((mni=m_impl->allMemberNameInfoSDict->find(md->name()))) { mni->append(mi); } else { mni = new MemberNameInfo(md->name()); mni->append(mi); m_impl->allMemberNameInfoSDict->append(mni->memberName(),mni); } } } void ClassDef::insertMember(MemberDef *md) { internalInsertMember(md,md->protection(),TRUE); } // compute the anchors for all members void ClassDef::computeAnchors() { ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0; const char *letters = "abcdefghijklmnopqrstuvwxyz0123456789"; QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; int index = 0; for (mli.toFirst();(ml=mli.current());++mli) { if ((ml->listType()&MemberList::detailedLists)==0) { setAnchors(context,letters[index++],ml); } } if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->setAnchors(context); } } } void ClassDef::distributeMemberGroupDocumentation() { if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->distributeMemberGroupDocumentation(); } } } void ClassDef::findSectionsInDocumentation() { docFindSections(documentation(),this,0,docFile()); if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->findSectionsInDocumentation(); } } QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if ((ml->listType()&MemberList::detailedLists)==0) { ml->findSectionsInDocumentation(); } } } // add a file name to the used files set void ClassDef::insertUsedFile(const char *f) { if (m_impl->files.find(f)==-1) m_impl->files.append(f); if (m_impl->templateInstances) { QDictIterator<ClassDef> qdi(*m_impl->templateInstances); ClassDef *cd; for (qdi.toFirst();(cd=qdi.current());++qdi) { cd->insertUsedFile(f); } } } static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd) { if (bcd->prot!=Public || bcd->virt!=Normal) { ol.startTypewriter(); ol.docify(" ["); QStrList sl; if (bcd->prot==Protected) sl.append("protected"); else if (bcd->prot==Private) sl.append("private"); if (bcd->virt==Virtual) sl.append("virtual"); const char *s=sl.first(); while (s) { ol.docify(s); s=sl.next(); if (s) ol.docify(", "); } ol.docify("]"); ol.endTypewriter(); } } void ClassDef::setIncludeFile(FileDef *fd, const char *includeName,bool local, bool force) { //printf("ClassDef::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force); if (!m_impl->incInfo) m_impl->incInfo=new IncludeInfo; if ((includeName && m_impl->incInfo->includeName.isEmpty()) || (fd!=0 && m_impl->incInfo->fileDef==0) ) { //printf("Setting file info\n"); m_impl->incInfo->fileDef = fd; m_impl->incInfo->includeName = includeName; m_impl->incInfo->local = local; } if (force && includeName) m_impl->incInfo->includeName = includeName; } // TODO: fix this: a nested template class can have multiple outer templates //ArgumentList *ClassDef::outerTemplateArguments() const //{ // int ti; // ClassDef *pcd=0; // int pi=0; // if (m_impl->tempArgs) return m_impl->tempArgs; // // find the outer most class scope // while ((ti=name().find("::",pi))!=-1 && // (pcd=getClass(name().left(ti)))==0 // ) pi=ti+2; // if (pcd) // { // return pcd->templateArguments(); // } // return 0; //} static void searchTemplateSpecs(/*in*/ Definition *d, /*out*/ QList<ArgumentList> &result, /*out*/ QCString &name) { if (d->definitionType()==Definition::TypeClass) { if (d->getOuterScope()) { searchTemplateSpecs(d->getOuterScope(),result,name); } ClassDef *cd=(ClassDef *)d; if (!name.isEmpty()) name+="::"; name+=d->localName(); bool isSpecialization = d->localName().find('<')!=-1; if (cd->templateArguments()) { result.append(cd->templateArguments()); if (!isSpecialization) { name+=tempArgListToString(cd->templateArguments()); } } } else { name+=d->qualifiedName(); } } static void writeTemplateSpec(OutputList &ol,Definition *d, const QCString &type) { QList<ArgumentList> specs; QCString name; searchTemplateSpecs(d,specs,name); if (specs.count()>0) // class has template scope specifiers { ol.startSubsubsection(); QListIterator<ArgumentList> spi(specs); ArgumentList *al; for (spi.toFirst();(al=spi.current());++spi) { ol.docify("template<"); Argument *a=al->first(); while (a) { ol.docify(a->type); if (!a->name.isEmpty()) { ol.docify(" "); ol.docify(a->name); } if (a->defval.length()!=0) { ol.docify(" = "); ol.docify(a->defval); } a=al->next(); if (a) ol.docify(", "); } ol.docify(">"); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.lineBreak(); ol.popGeneratorState(); } ol.docify(type.lower()+" "+name); ol.endSubsubsection(); ol.writeString("\n"); } } // write the detailed description for this class void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag) { if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || !documentation().isEmpty() || (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) || exampleFlag) { ol.writeRuler(); ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); ol.writeAnchor(0,"_details"); ol.popGeneratorState(); ol.startGroupHeader(); ol.parseText(theTranslator->trDetailedDescription()); ol.endGroupHeader(); ol.startTextBlock(); writeTemplateSpec(ol,this,pageType); // repeat brief description if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) { ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE); } if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && !documentation().isEmpty()) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::RTF); ol.newParagraph(); ol.enableAll(); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n\n"); ol.popGeneratorState(); } // write documentation if (!documentation().isEmpty()) { //ol.newParagraph(); ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE); } // write type constraints writeTypeConstraints(ol,this,m_impl->typeConstraints); // write examples if (exampleFlag && m_impl->exampleSDict) { ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); ol.writeDescItem(); ol.newParagraph(); writeExample(ol,m_impl->exampleSDict); ol.endSimpleSect(); } //ol.newParagraph(); writeSourceDef(ol,name()); ol.endTextBlock(); } else { writeTemplateSpec(ol,this,pageType); } } void ClassDef::showUsedFiles(OutputList &ol) { if (Config_getBool("SHOW_USED_FILES")) { ol.writeRuler(); ol.parseText(theTranslator->trGeneratedFromFiles( m_impl->isObjC && m_impl->compType==Interface ? Class : m_impl->compType, m_impl->files.count()==1)); bool first=TRUE; const char *file = m_impl->files.first(); while (file) { bool ambig; FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig); if (fd) { if (first) { first=FALSE; ol.startItemList(); } ol.writeListItem(); QCString path=fd->getPath().copy(); if (Config_getBool("FULL_PATH_NAMES")) { ol.docify(stripFromPath(path)); } QCString fname = fd->name(); if (!fd->getVersion().isEmpty()) // append version if available { fname += " (" + fd->getVersion() + ")"; } // for HTML ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); if (fd->generateSourceFile()) { ol.writeObjectLink(0,fd->getSourceFileBase(),0,fname); } else if (fd->isLinkable()) { ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, fname); } else { ol.docify(fname); } ol.popGeneratorState(); // for other output formats ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); if (fd->isLinkable()) { ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0, fname); } else { ol.docify(fname); } ol.popGeneratorState(); } file=m_impl->files.next(); } if (!first) ol.endItemList(); } } void ClassDef::writeClassDiagrams(OutputList &ol) { // count direct inheritance relations int count=0; BaseClassDef *ibcd; if (m_impl->inheritedBy) { ibcd=m_impl->inheritedBy->first(); while (ibcd) { ClassDef *icd=ibcd->classDef; if ( icd->isVisibleInHierarchy()) count++; ibcd=m_impl->inheritedBy->next(); } } if (m_impl->inherits) { ibcd=m_impl->inherits->first(); while (ibcd) { ClassDef *icd=ibcd->classDef; if ( icd->isVisibleInHierarchy()) count++; ibcd=m_impl->inherits->next(); } } bool renderDiagram = FALSE; if (Config_getBool("HAVE_DOT") && Config_getBool("CLASS_GRAPH")) // write class diagram using dot { DotClassGraph inheritanceGraph(this,DotNode::Inheritance); if (!inheritanceGraph.isTrivial() && !inheritanceGraph.isTooBig()) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.startDotGraph(); ol.parseText(theTranslator->trClassDiagram(displayName())); ol.endDotGraph(inheritanceGraph); ol.popGeneratorState(); renderDiagram = TRUE; } } else if (Config_getBool("CLASS_DIAGRAMS") && count>0) // write class diagram using build-in generator { ClassDiagram diagram(this); // create a diagram of this class. ol.startClassDiagram(); ol.disable(OutputGenerator::Man); ol.parseText(theTranslator->trClassDiagram(displayName())); ol.enable(OutputGenerator::Man); ol.endClassDiagram(diagram,getOutputFileBase(),displayName()); renderDiagram = TRUE; } if (renderDiagram) // if we already show the inheritance relations graphically, // then hide the text version { ol.disableAllBut(OutputGenerator::Man); } if (m_impl->inherits && (count=m_impl->inherits->count())>0) { //parseText(ol,theTranslator->trInherits()+" "); QCString inheritLine = theTranslator->trInheritsList(m_impl->inherits->count()); QRegExp marker("@[0-9]+"); int index=0,newIndex,matchLen; // now replace all markers in inheritLine with links to the classes while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1) { ol.parseText(inheritLine.mid(index,newIndex-index)); bool ok; uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok); BaseClassDef *bcd=m_impl->inherits->at(entryIndex); if (ok && bcd) { ClassDef *cd=bcd->classDef; if (cd->isLinkable()) { if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <base"; if (bcd->prot==Protected) { Doxygen::tagFile << " protection=\"protected\""; } else if (bcd->prot==Private) { Doxygen::tagFile << " protection=\"private\""; } if (bcd->virt==Virtual) { Doxygen::tagFile << " virtualness=\"virtual\""; } Doxygen::tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl; } ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName()+bcd->templSpecifiers); } else { ol.docify(cd->displayName()); } } else { err("Error: invalid marker %d in inherits list!\n",entryIndex); } index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); ol.newParagraph(); } // write subclasses if (m_impl->inheritedBy && (count=m_impl->inheritedBy->count())>0) { QCString inheritLine = theTranslator->trInheritedByList(m_impl->inheritedBy->count()); QRegExp marker("@[0-9]+"); int index=0,newIndex,matchLen; // now replace all markers in inheritLine with links to the classes while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1) { ol.parseText(inheritLine.mid(index,newIndex-index)); bool ok; uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok); BaseClassDef *bcd=m_impl->inheritedBy->at(entryIndex); if (ok && bcd) { ClassDef *cd=bcd->classDef; if (cd->isLinkable()) { ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName()); } else { ol.docify(cd->displayName()); } writeInheritanceSpecifier(ol,bcd); } index=newIndex+matchLen; } ol.parseText(inheritLine.right(inheritLine.length()-index)); ol.newParagraph(); } if (renderDiagram) { ol.enableAll(); } if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH")) { DotClassGraph usageImplGraph(this,DotNode::Collaboration); if (!usageImplGraph.isTrivial()) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.startDotGraph(); ol.parseText(theTranslator->trCollaborationDiagram(displayName())); ol.endDotGraph(usageImplGraph); ol.popGeneratorState(); } } } // write all documentation for this class void ClassDef::writeDocumentation(OutputList &ol) { QCString pageType = " "; pageType += compoundTypeString(); toupper(pageType.at(1)); QCString pageTitle = theTranslator->trCompoundReference(displayName(), m_impl->compType == Interface && m_impl->isObjC ? Class : m_impl->compType, m_impl->tempArgs != 0); startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_ClassVisible); if (getOuterScope()!=Doxygen::globalScope) { writeNavigationPath(ol); } startTitle(ol,getOutputFileBase()); ol.parseText(pageTitle); addGroupListToTitle(ol,this); endTitle(ol,getOutputFileBase(),name()); { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString("<!-- doxytag: class=\""); ol.docify(name()); ol.writeString("\" -->"); if (m_impl->inherits && m_impl->inherits->count()>0) { BaseClassListIterator bli(*m_impl->inherits); ol.writeString("<!-- doxytag: inherits=\""); BaseClassDef *bcd=0; bool first=TRUE; for (bli.toFirst();(bcd=bli.current());++bli) { if (!first) ol.writeString(","); ol.docify(bcd->classDef->name()); first=FALSE; } ol.writeString("\" -->"); } ol.popGeneratorState(); } if (Config_getBool("SEARCHENGINE")) { Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase()); Doxygen::searchIndex->addWord(localName(),TRUE); } ol.startTextBlock(); //printf("Class %s brief=`%s' doc=`%s'\n",name().data(),briefDescription().data(),documentation().data()); bool exampleFlag=hasExamples(); // write brief description if (!briefDescription().isEmpty()) { if (!Config_getBool("DETAILS_AT_TOP")) { ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.writeString(" \n"); ol.enable(OutputGenerator::RTF); ol.disableAllBut(OutputGenerator::Html); ol.startTextLink(0,"_details"); if (Config_getBool("REPEAT_BRIEF") || !documentation().isEmpty() || exampleFlag ) { ol.parseText(theTranslator->trMore()); } ol.endTextLink(); ol.popGeneratorState(); ol.pushGeneratorState(); ol.disable(OutputGenerator::RTF); ol.newParagraph(); ol.popGeneratorState(); } } ol.writeSynopsis(); if (m_impl->incInfo && Config_getBool("SHOW_INCLUDE_FILES")) { QCString nm=m_impl->incInfo->includeName.isEmpty() ? (m_impl->incInfo->fileDef ? m_impl->incInfo->fileDef->docName().data() : "" ) : m_impl->incInfo->includeName.data(); if (!nm.isEmpty()) { ol.startTypewriter(); bool isIDLorJava = nm.right(4)==".idl" || nm.right(5)==".pidl" || nm.right(5)==".java"; if (isIDLorJava) { ol.docify("import "); } else if (isObjectiveC()) { ol.docify("#import "); } else { ol.docify("#include "); } if (m_impl->incInfo->local || isIDLorJava) ol.docify("\""); else ol.docify("<"); ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); ol.docify(nm); ol.disableAllBut(OutputGenerator::Html); ol.enable(OutputGenerator::Html); if (m_impl->incInfo->fileDef) { ol.writeObjectLink(0,m_impl->incInfo->fileDef->includeName(),0,nm); } else { ol.docify(nm); } ol.popGeneratorState(); if (m_impl->incInfo->local || isIDLorJava) ol.docify("\""); else ol.docify(">"); if (isIDLorJava) ol.docify(";"); ol.endTypewriter(); ol.newParagraph(); } } if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " <compound kind=\"" << compoundTypeString(); Doxygen::tagFile << "\""; if (isObjectiveC()) { Doxygen::tagFile << " objc=\"yes\""; } Doxygen::tagFile << ">" << endl; Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl; Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl; if (m_impl->tempArgs) { ArgumentListIterator ali(*m_impl->tempArgs); Argument *a; for (;(a=ali.current());++ali) { Doxygen::tagFile << " <templarg>" << convertToXML(a->name) << "</templarg>" << endl; } } } writeClassDiagrams(ol); // write link to list of all members (HTML only) if (m_impl->allMemberNameInfoSDict && !Config_getBool("OPTIMIZE_OUTPUT_FOR_C") ) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.newParagraph(); ol.startTextLink(getMemberListFileName(),0); ol.parseText(theTranslator->trListOfAllMembers()); ol.endTextLink(); ol.enableAll(); ol.popGeneratorState(); } ol.endTextBlock(); // write detailed description if the user wants it near the top if (Config_getBool("DETAILS_AT_TOP")) { writeDetailedDescription(ol,pageType,exampleFlag); } /////////////////////////////////////////////////////////////////////////// //// Member declarations + brief descriptions /////////////////////////////////////////////////////////////////////////// // write member groups ol.startMemberSections(); // write user defined member groups if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section { mg->writeDeclarations(ol,this,0,0,0); } else // add this group to the corresponding member section { //printf("addToDeclarationSection(%s)\n",mg->header().data()); //mg->addToDeclarationSection(); } } } // public types writeMemberDeclarations(ol,MemberList::pubTypes,theTranslator->trPublicTypes()); // public methods writeMemberDeclarations(ol,MemberList::pubSlots,theTranslator->trPublicSlots()); writeMemberDeclarations(ol,MemberList::signals,theTranslator->trSignals()); writeMemberDeclarations(ol,MemberList::dcopMethods,theTranslator->trDCOPMethods()); writeMemberDeclarations(ol,MemberList::pubMethods,theTranslator->trPublicMembers()); writeMemberDeclarations(ol,MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers()); // public attribs writeMemberDeclarations(ol,MemberList::pubAttribs,theTranslator->trPublicAttribs()); writeMemberDeclarations(ol,MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs()); // protected types writeMemberDeclarations(ol,MemberList::proTypes,theTranslator->trProtectedTypes()); // protected methods writeMemberDeclarations(ol,MemberList::proSlots,theTranslator->trProtectedSlots()); writeMemberDeclarations(ol,MemberList::proMethods,theTranslator->trProtectedMembers()); writeMemberDeclarations(ol,MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers()); // protected attribs writeMemberDeclarations(ol,MemberList::proAttribs,theTranslator->trProtectedAttribs()); writeMemberDeclarations(ol,MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs()); // package types writeMemberDeclarations(ol,MemberList::pacTypes,theTranslator->trPackageTypes()); // package methods writeMemberDeclarations(ol,MemberList::pacMethods,theTranslator->trPackageMembers()); writeMemberDeclarations(ol,MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers()); // package attribs writeMemberDeclarations(ol,MemberList::pacAttribs,theTranslator->trPackageAttribs()); writeMemberDeclarations(ol,MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs()); // package writeMemberDeclarations(ol,MemberList::properties,theTranslator->trProperties()); // events writeMemberDeclarations(ol,MemberList::events,theTranslator->trEvents()); if (Config_getBool("EXTRACT_PRIVATE")) { // private types writeMemberDeclarations(ol,MemberList::priTypes,theTranslator->trPrivateTypes()); // private members writeMemberDeclarations(ol,MemberList::priSlots,theTranslator->trPrivateSlots()); writeMemberDeclarations(ol,MemberList::priMethods,theTranslator->trPrivateMembers()); writeMemberDeclarations(ol,MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers()); // private attribs writeMemberDeclarations(ol,MemberList::priAttribs,theTranslator->trPrivateAttribs()); writeMemberDeclarations(ol,MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs()); } // friends writeMemberDeclarations(ol,MemberList::friends,theTranslator->trFriends()); // related functions writeMemberDeclarations(ol,MemberList::related,theTranslator->trRelatedFunctions(), theTranslator->trRelatedSubscript() ); //if (related) related->writeDeclarations(ol,this,0,0,0, // theTranslator->trRelatedFunctions(), // theTranslator->trRelatedSubscript() // ); // nested classes if (m_impl->innerClasses) m_impl->innerClasses->writeDeclaration(ol,0,0,TRUE); ol.endMemberSections(); // write detailed description if (!Config_getBool("DETAILS_AT_TOP")) { writeDetailedDescription(ol,pageType,exampleFlag); } writeMemberDocumentation(ol); ///////////////////////////////////////////////////////////////////// ol.startTextBlock(); // write the list of used files (not for man pages) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); showUsedFiles(ol); // write Author section (Man only) ol.enable(OutputGenerator::Man); ol.disableAllBut(OutputGenerator::Man); ol.writeString("\n"); ol.startGroupHeader(); ol.parseText(theTranslator->trAuthor(TRUE,TRUE)); ol.endGroupHeader(); ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME"))); ol.popGeneratorState(); ol.endTextBlock(); ///////////////////////////////////////////////////////////////////// if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { writeDocAnchorsToTagFile(); Doxygen::tagFile << " </compound>" << endl; } endFile(ol); if (Config_getBool("SEPARATE_MEMBER_PAGES")) { writeMemberPages(ol); } } void ClassDef::writeMemberDocumentation(OutputList &ol) { /////////////////////////////////////////////////////////////////////////// //// Member definitions + detailed documentation /////////////////////////////////////////////////////////////////////////// if (Config_getBool("SEPARATE_MEMBER_PAGES")) { ol.disable(OutputGenerator::Html); Doxygen::suppressDocWarnings = TRUE; } writeMemberDocumentation(ol,MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation()); writeMemberDocumentation(ol,MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation()); writeMemberDocumentation(ol,MemberList::constructors,theTranslator->trConstructorDocumentation()); writeMemberDocumentation(ol,MemberList::functionMembers,theTranslator->trMemberFunctionDocumentation()); writeMemberDocumentation(ol,MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation()); writeMemberDocumentation(ol,MemberList::variableMembers,theTranslator->trMemberDataDocumentation()); writeMemberDocumentation(ol,MemberList::propertyMembers,theTranslator->trPropertyDocumentation()); writeMemberDocumentation(ol,MemberList::eventMembers,theTranslator->trEventDocumentation()); if (Config_getBool("SEPARATE_MEMBER_PAGES")) { ol.enable(OutputGenerator::Html); Doxygen::suppressDocWarnings = FALSE; } } void ClassDef::writeMemberPages(OutputList &ol) { /////////////////////////////////////////////////////////////////////////// //// Member definitions on separate pages /////////////////////////////////////////////////////////////////////////// ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if (ml->listType()&MemberList::detailedLists) { ml->writeDocumentationPage(ol,name(),this); } } ol.popGeneratorState(); } void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const { static bool createSubDirs=Config_getBool("CREATE_SUBDIRS"); ol.writeString(" <div class=\"navtab\">\n"); ol.writeString(" <table>\n"); if (m_impl->allMemberNameInfoSDict) { MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict); MemberNameInfo *mni; for (;(mni=mnili.current());++mnili) { MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { MemberDef *md=mi->memberDef; if (md->getClassDef()==this && md->isLinkable()) { ol.writeString(" <tr><td class=\"navtab\">"); if (md->isLinkableInProject()) { if (md==currentMd) // selected item => highlight { ol.writeString("<a class=\"qindexHL\" "); } else { ol.writeString("<a class=\"qindex\" "); } ol.writeString("href=\""); if (createSubDirs) ol.writeString("../../"); ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor()); ol.writeString("\">"); ol.writeString(md->name()); ol.writeString("</a>"); } ol.writeString("</td></tr>\n"); } } } } ol.writeString(" </table>\n"); ol.writeString(" </div>\n"); } void ClassDef::writeDocumentationForInnerClasses(OutputList &ol) { // write inner classes after the parent, so the tag files contain // the definition in proper order! if (m_impl->innerClasses) { ClassSDict::Iterator cli(*m_impl->innerClasses); ClassDef *innerCd; for (cli.toFirst();(innerCd=cli.current());++cli) { if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 && (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE")) ) { msg("Generating docs for nested compound %s...\n",innerCd->name().data()); innerCd->writeDocumentation(ol); innerCd->writeMemberList(ol); } innerCd->writeDocumentationForInnerClasses(ol); } } } // write the list of all (inherited) members for this class void ClassDef::writeMemberList(OutputList &ol) { if (m_impl->allMemberNameInfoSDict==0 || Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) return; // only for HTML ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); QCString memListFile = getMemberListFileName(); startFile(ol,memListFile,memListFile, theTranslator->trMemberList(),HLI_ClassVisible); startTitle(ol,0); ol.parseText(displayName()+" "+theTranslator->trMemberList()); endTitle(ol,0,0); ol.parseText(theTranslator->trThisIsTheListOfAllMembers()); ol.writeObjectLink(getReference(),getOutputFileBase(),0,displayName()); ol.parseText(theTranslator->trIncludingInheritedMembers()); //ol.startItemList(); ol.writeString("<p><table>\n"); //MemberNameInfo *mni=m_impl->allMemberNameInfoList->first(); MemberNameInfoSDict::Iterator mnii(*m_impl->allMemberNameInfoSDict); MemberNameInfo *mni; for (mnii.toFirst();(mni=mnii.current());++mnii) { MemberInfo *mi=mni->first(); while (mi) { MemberDef *md=mi->memberDef; ClassDef *cd=md->getClassDef(); Protection prot = mi->prot; Specifier virt=md->virtualness(); //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n", // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited); if (cd && !md->name().isEmpty() && md->name()[0]!='@') { bool memberWritten=FALSE; if (cd->isLinkable() && md->isLinkable()) // create a link to the documentation { QCString name=mi->ambiguityResolutionScope+md->name(); //ol.writeListItem(); ol.writeString(" <tr class=\"memlist\"><td>"); if (cd->isObjectiveC()) { if (md->isObjCMethod()) { if (md->isStatic()) ol.writeString("+&nbsp;</td><td>"); else ol.writeString("-&nbsp;</td><td>"); } else ol.writeString("</td><td>"); } if (md->isObjCMethod()) { ol.writeObjectLink(md->getReference(), md->getOutputFileBase(), md->anchor(),md->name()); } else { //Definition *bd = md->getGroupDef(); //if (bd==0) bd=cd; ol.writeObjectLink(md->getReference(), md->getOutputFileBase(), md->anchor(),name); if ( md->isFunction() || md->isSignal() || md->isSlot() || (md->isFriend() && md->argsString())) ol.docify(md->argsString()); else if (md->isEnumerate()) ol.parseText(" "+theTranslator->trEnumName()); else if (md->isEnumValue()) ol.parseText(" "+theTranslator->trEnumValue()); else if (md->isTypedef()) ol.docify(" typedef"); else if (md->isFriend() && !strcmp(md->typeString(),"friend class")) ol.docify(" class"); //ol.writeString("\n"); } ol.writeString("</td>"); memberWritten=TRUE; } else if (!Config_getBool("HIDE_UNDOC_MEMBERS") && (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE") || md->isFriend()) ) // no documentation, // generate link to the class instead. { //ol.writeListItem(); ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>"); if (cd->isObjectiveC()) { if (md->isObjCMethod()) { if (md->isStatic()) ol.writeString("+&nbsp;</td><td>"); else ol.writeString("-&nbsp;</td><td>"); } else ol.writeString("</td><td>"); } ol.startBold(); ol.docify(md->name()); ol.endBold(); if (!md->isObjCMethod()) { if ( md->isFunction() || md->isSignal() || md->isSlot() ) ol.docify(md->argsString()); else if (md->isEnumerate()) ol.parseText(" "+theTranslator->trEnumName()); else if (md->isEnumValue()) ol.parseText(" "+theTranslator->trEnumValue()); else if (md->isTypedef()) ol.docify(" typedef"); } ol.writeString(" ("); ol.parseText(theTranslator->trDefinedIn()+" "); if (cd->isLinkable()) { ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName()); } else { ol.startBold(); ol.docify(cd->displayName()); ol.endBold(); } ol.writeString(")"); ol.writeString("</td>"); memberWritten=TRUE; } if (memberWritten) { ol.writeString("<td>"); ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(), 0,cd->displayName()); ol.writeString("</td>"); ol.writeString("<td>"); } if ( (prot!=Public || (virt!=Normal && !m_impl->isObjC) || md->isFriend() || md->isRelated() || md->isExplicit() || md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) || md->isSignal() || md->isSlot() || md->isStatic() ) && memberWritten) { ol.startTypewriter(); ol.docify(" ["); QStrList sl; if (md->isFriend()) sl.append("friend"); else if (md->isRelated()) sl.append("related"); else { if (Config_getBool("INLINE_INFO") && md->isInline()) sl.append("inline"); if (md->isExplicit()) sl.append("explicit"); if (md->isMutable()) sl.append("mutable"); if (prot==Protected) sl.append("protected"); else if (prot==Private) sl.append("private"); else if (prot==Package) sl.append("package"); if (virt==Virtual && !m_impl->isObjC) sl.append("virtual"); else if (virt==Pure) sl.append("pure virtual"); if (md->isStatic()) sl.append("static"); if (md->isSignal()) sl.append("signal"); if (md->isSlot()) sl.append("slot"); } const char *s=sl.first(); while (s) { ol.docify(s); s=sl.next(); if (s) ol.docify(", "); } ol.docify("]"); ol.endTypewriter(); } if (memberWritten) { ol.writeString("</td>"); ol.writeString("</tr>\n"); } } mi=mni->next(); } } //ol.endItemList(); ol.writeString("</table>"); endFile(ol); ol.popGeneratorState(); } // add a reference to an example bool ClassDef::addExample(const char *anchor,const char *nameStr, const char *file) { if (m_impl->exampleSDict==0) { m_impl->exampleSDict = new ExampleSDict; m_impl->exampleSDict->setAutoDelete(TRUE); } if (!m_impl->exampleSDict->find(nameStr)) { Example *e=new Example; e->anchor=anchor; e->name=nameStr; e->file=file; m_impl->exampleSDict->inSort(nameStr,e); return TRUE; } return FALSE; } // returns TRUE if this class is used in an example bool ClassDef::hasExamples() { if (m_impl->exampleSDict==0) return FALSE; else return m_impl->exampleSDict->count()>0; } void ClassDef::setTemplateArguments(ArgumentList *al) { if (al==0) return; if (!m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed m_impl->tempArgs=new ArgumentList; ArgumentListIterator ali(*al); Argument *a; for (;(a=ali.current());++ali) { m_impl->tempArgs->append(new Argument(*a)); } } void ClassDef::setTypeConstraints(ArgumentList *al) { if (al==0) return; if (!m_impl->typeConstraints) delete m_impl->typeConstraints; m_impl->typeConstraints = new ArgumentList; ArgumentListIterator ali(*al); Argument *a; for (;(a=ali.current());++ali) { m_impl->typeConstraints->append(new Argument(*a)); } } /*! Returns \c TRUE iff this class or a class inheriting from this class * is \e not defined in an external tag file. */ bool ClassDef::hasNonReferenceSuperClass() { bool found=!isReference() && isLinkableInProject() && !isHidden(); if (found) { return TRUE; // we're done if this class is not a reference } if (m_impl->inheritedBy) { BaseClassListIterator bcli(*m_impl->inheritedBy); for ( ; bcli.current() && !found ; ++bcli ) // for each super class { ClassDef *bcd=bcli.current()->classDef; // recurse into the super class branch found = found || bcd->hasNonReferenceSuperClass(); if (!found) { // look for template instances that might have non-reference super classes QDict<ClassDef> *cil = bcd->getTemplateInstances(); if (cil) { QDictIterator<ClassDef> tidi(*cil); for ( ; tidi.current() && !found ; ++tidi) // for each template instance { // recurse into the template instance branch found = found || tidi.current()->hasNonReferenceSuperClass(); } } } } } return found; } /*! called from MemberDef::writeDeclaration() to (recusively) write the * definition of an annonymous struct, union or class. */ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup) { //ol.insertMemberAlign(); //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup); //if (inGroup && md && md->getClassDef()==this) return; ol.docify(compoundTypeString()); int ri=name().findRev("::"); if (ri==-1) ri=name().length(); QCString cn=name().right(name().length()-ri-2); if (!cn.isEmpty() && cn.at(0)!='@' && md) { ol.docify(" "); if (isLinkable()) { ol.writeObjectLink(0,0,md->anchor(),cn); } else { ol.startBold(); ol.docify(cn); ol.endBold(); } } ol.docify(" {"); ol.endMemberItem(); // write user defined member groups if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->setInGroup(inGroup); mg->writePlainDeclarations(ol,this,0,0,0); } } writePlainMemberDeclaration(ol,MemberList::pubTypes,inGroup); writePlainMemberDeclaration(ol,MemberList::pubMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::pubAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::pubSlots,inGroup); writePlainMemberDeclaration(ol,MemberList::signals,inGroup); writePlainMemberDeclaration(ol,MemberList::dcopMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::properties,inGroup); writePlainMemberDeclaration(ol,MemberList::events,inGroup); writePlainMemberDeclaration(ol,MemberList::pubStaticMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::pubStaticAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::proTypes,inGroup); writePlainMemberDeclaration(ol,MemberList::proMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::proAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::proSlots,inGroup); writePlainMemberDeclaration(ol,MemberList::proStaticMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::proStaticAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::pacTypes,inGroup); writePlainMemberDeclaration(ol,MemberList::pacMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::pacAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::pacStaticMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::pacStaticAttribs,inGroup); if (Config_getBool("EXTRACT_PRIVATE")) { writePlainMemberDeclaration(ol,MemberList::priTypes,inGroup); writePlainMemberDeclaration(ol,MemberList::priMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::priAttribs,inGroup); writePlainMemberDeclaration(ol,MemberList::priSlots,inGroup); writePlainMemberDeclaration(ol,MemberList::priStaticMethods,inGroup); writePlainMemberDeclaration(ol,MemberList::priStaticAttribs,inGroup); } writePlainMemberDeclaration(ol,MemberList::friends,inGroup); writePlainMemberDeclaration(ol,MemberList::related,inGroup); } /*! a link to this class is possible within this project */ bool ClassDef::isLinkableInProject() const { if (m_impl->templateMaster) { return m_impl->templateMaster->isLinkableInProject(); } else { return !name().isEmpty() && /* no name */ !m_impl->artificial && !isHidden() && name().find('@')==-1 && /* anonymous compound */ (m_impl->prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */ (!m_impl->isLocal || Config_getBool("EXTRACT_LOCAL_CLASSES")) && /* local */ hasDocumentation() && /* documented */ !isReference() && /* not an external reference */ (!m_impl->isStatic || Config_getBool("EXTRACT_STATIC")); } } bool ClassDef::isLinkable() const { if (m_impl->templateMaster) { return m_impl->templateMaster->isLinkable(); } else { return isLinkableInProject() || isReference(); } } /*! the class is visible in a class diagram, or class hierarchy */ bool ClassDef::isVisibleInHierarchy() { static bool allExternals = Config_getBool("ALLEXTERNALS"); static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES"); static bool extractStatic = Config_getBool("EXTRACT_STATIC"); return // show all classes or a subclass is visible (allExternals || hasNonReferenceSuperClass()) && // and not an annonymous compound name().find('@')==-1 && // not an artifically introduced class !m_impl->artificial && // and not privately inherited (m_impl->prot!=Private || extractPrivate) && // documented or shown anyway or documentation is external (hasDocumentation() || !hideUndocClasses || (m_impl->templateMaster && m_impl->templateMaster->hasDocumentation()) || isReference() ) && // is not part of an unnamed namespace or shown anyway (!m_impl->isStatic || extractStatic); } bool ClassDef::hasDocumentation() const { return Definition::hasDocumentation(); } //---------------------------------------------------------------------- // recursive function: // returns TRUE iff class definition `bcd' represents an (in)direct base // class of class definition `cd'. bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level) { bool found=FALSE; //printf("isBaseClass(cd=%s) looking for %s\n",cd->name().data(),bcd->name().data()); if (level>256) { err("Possible recursive class relation while inside %s and looking for %s\n",name().data(),bcd->name().data()); abort(); return FALSE; } if (baseClasses()) { BaseClassListIterator bcli(*baseClasses()); for ( ; bcli.current() && !found ; ++bcli) { ClassDef *ccd=bcli.current()->classDef; if (!followInstances && ccd->templateMaster()) ccd=ccd->templateMaster(); //printf("isBaseClass() baseclass %s\n",ccd->name().data()); if (ccd==bcd) found=TRUE; else found=ccd->isBaseClass(bcd,followInstances,level+1); } } return found; } //---------------------------------------------------------------------------- static bool isStandardFunc(MemberDef *md) { return md->name()=="operator=" || // assignment operator md->isConstructor() || // constructor md->isDestructor(); // destructor } /*! * recusively merges the `all members' lists of a class base * with that of this class. Must only be called for classes without * subclasses! */ void ClassDef::mergeMembers() { if (m_impl->membersMerged) return; m_impl->membersMerged=TRUE; //printf(" mergeMembers for %s\n",name().data()); bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB" ); if (baseClasses()) { //printf(" => has base classes!\n"); BaseClassListIterator bcli(*baseClasses()); BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { ClassDef *bClass=bcd->classDef; // merge the members in the base class of this inheritance branch first bClass->mergeMembers(); MemberNameInfoSDict *srcMnd = bClass->memberNameInfoSDict(); MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict; if (srcMnd) { MemberNameInfoSDict::Iterator srcMnili(*srcMnd); MemberNameInfo *srcMni; for ( ; (srcMni=srcMnili.current()) ; ++srcMnili) { //printf(" Base member name %s\n",srcMni->memberName()); MemberNameInfo *dstMni; if (dstMnd!=0 && (dstMni=dstMnd->find(srcMni->memberName()))) // a member with that name is already in the class. // the member may hide or reimplement the one in the sub class // or there may be another path to the base class that is already // visited via another branch in the class hierarchy. { MemberNameInfoIterator srcMnii(*srcMni); MemberInfo *srcMi; for ( ; (srcMi=srcMnii.current()) ; ++srcMnii ) { MemberDef *srcMd = srcMi->memberDef; bool found=FALSE; bool ambigue=FALSE; bool hidden=FALSE; MemberNameInfoIterator dstMnii(*dstMni); MemberInfo *dstMi; ClassDef *srcCd = srcMd->getClassDef(); for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii ) { MemberDef *dstMd = dstMi->memberDef; if (srcMd!=dstMd) // different members { ClassDef *dstCd = dstMd->getClassDef(); //printf(" Is %s a base class of %s?\n",srcCd->name().data(),dstCd->name().data()); if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE)) // member is in the same or a base class { LockingPtr<ArgumentList> srcAl = srcMd->argumentList(); LockingPtr<ArgumentList> dstAl = dstMd->argumentList(); found=matchArguments2( srcMd->getOuterScope(),srcMd->getFileDef(),srcAl.pointer(), dstMd->getOuterScope(),dstMd->getFileDef(),dstAl.pointer(), TRUE ); //printf(" Yes, matching (%s<->%s): %d\n", // argListToString(srcMd->argumentList()).data(), // argListToString(dstMd->argumentList()).data(), // found); hidden = hidden || !found; } else // member is in a non base class => multiple inheritance // using the same base class. { //printf("$$ Existing member %s %s add scope %s\n", // dstMi->ambiguityResolutionScope.data(), // dstMd->name().data(), // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data()); QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) dstMi->ambiguityResolutionScope.prepend(scope); ambigue=TRUE; } } else // same members { // do not add if base class is virtual or // if scope paths are equal or // if base class is an interface (and thus implicitly virtual). //printf("same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt,dstMi->virt); if ((srcMi->virt!=Normal && dstMi->virt!=Normal) || bClass->name()+"::"+srcMi->scopePath == dstMi->scopePath || dstMd->getClassDef()->compoundType()==Interface ) { found=TRUE; } else // member can be reached via multiple paths in the // inheritance tree { //printf("$$ Existing member %s %s add scope %s\n", // dstMi->ambiguityResolutionScope.data(), // dstMd->name().data(), // dstMi->scopePath.left(dstMi->scopePath.find("::")+2).data()); QCString scope=dstMi->scopePath.left(dstMi->scopePath.find("::")+2); if (scope!=dstMi->ambiguityResolutionScope.left(scope.length())) { dstMi->ambiguityResolutionScope.prepend(scope); } ambigue=TRUE; } } } //printf("member %s::%s hidden %d ambigue %d srcMi->ambigClass=%p\n", // srcCd->name().data(),srcMd->name().data(),hidden,ambigue,srcMi->ambigClass); // TODO: fix the case where a member is hidden by inheritance // of a member with the same name but with another prototype, // while there is more than one path to the member in the // base class due to multiple inheritance. In this case // it seems that the member is not reachable by prefixing a // scope name either (according to my compiler). Currently, // this case is shown anyway. if (!found && srcMd->protection()!=Private) { Protection prot=srcMd->protection(); if (bcd->prot==Protected && prot==Public) prot=bcd->prot; else if (bcd->prot==Private) prot=bcd->prot; if (inlineInheritedMembers) { if (!isStandardFunc(srcMd)) { //printf(" insertMember `%s'\n",srcMd->name().data()); internalInsertMember(srcMd,prot,FALSE); } } Specifier virt=srcMi->virt; if (srcMi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; MemberInfo *newMi = new MemberInfo(srcMd,prot,virt,TRUE); newMi->scopePath=bClass->name()+"::"+srcMi->scopePath; if (ambigue) { //printf("$$ New member %s %s add scope %s::\n", // srcMi->ambiguityResolutionScope.data(), // srcMd->name().data(), // bClass->name().data()); QCString scope=bClass->name()+"::"; if (scope!=srcMi->ambiguityResolutionScope.left(scope.length())) { newMi->ambiguityResolutionScope= scope+srcMi->ambiguityResolutionScope.copy(); } } if (hidden) { if (srcMi->ambigClass==0) { newMi->ambigClass=bClass; newMi->ambiguityResolutionScope=bClass->name()+"::"; } else { newMi->ambigClass=srcMi->ambigClass; newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+"::"; } } dstMni->append(newMi); } } } else // base class has a member that is not in the sub class => copy { // create a deep copy of the list (only the MemberInfo's will be // copied, not the actual MemberDef's) MemberNameInfo *newMni = 0; newMni = new MemberNameInfo(srcMni->memberName()); // copy the member(s) from the base to the sub class MemberNameInfoIterator mnii(*srcMni); MemberInfo *mi; for (;(mi=mnii.current());++mnii) { Protection prot = mi->prot; if (bcd->prot==Protected) { if (prot==Public) prot=Protected; } else if (bcd->prot==Private) { prot=Private; } //printf("%s::%s: prot=%d bcd->prot=%d result=%d\n", // name().data(),mi->memberDef->name().data(),mi->prot, // bcd->prot,prot); if (mi->prot!=Private) { Specifier virt=mi->virt; if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; if (inlineInheritedMembers) { if (!isStandardFunc(mi->memberDef)) { //printf(" insertMember `%s'\n",mi->memberDef->name().data()); internalInsertMember(mi->memberDef,prot,FALSE); } } //printf("Adding!\n"); MemberInfo *newMi=new MemberInfo(mi->memberDef,prot,virt,TRUE); newMi->scopePath=bClass->name()+"::"+mi->scopePath; newMi->ambigClass=mi->ambigClass; newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy(); newMni->append(newMi); } } if (dstMnd==0) { m_impl->allMemberNameInfoSDict = new MemberNameInfoSDict(17); m_impl->allMemberNameInfoSDict->setAutoDelete(TRUE); dstMnd = m_impl->allMemberNameInfoSDict; } // add it to the dictionary dstMnd->append(newMni->memberName(),newMni); } } } } } //printf(" end mergeMembers\n"); } //---------------------------------------------------------------------------- /*! Merges the members of a Objective-C category into this class. */ void ClassDef::mergeCategory(ClassDef *category) { category->setCategoryOf(this); MemberNameInfoSDict *srcMnd = category->memberNameInfoSDict(); MemberNameInfoSDict *dstMnd = m_impl->allMemberNameInfoSDict; if (srcMnd && dstMnd) { MemberNameInfoSDict::Iterator srcMnili(*srcMnd); MemberNameInfo *srcMni; for ( ; (srcMni=srcMnili.current()) ; ++srcMnili) { MemberNameInfo *dstMni=dstMnd->find(srcMni->memberName()); if (dstMni) // method is already defined in the class { // TODO: we should remove the other member and insert this one. } else // new method name { // create a deep copy of the list (only the MemberInfo's will be // copied, not the actual MemberDef's) MemberNameInfo *newMni = 0; newMni = new MemberNameInfo(srcMni->memberName()); // copy the member(s) from the category to this class MemberNameInfoIterator mnii(*srcMni); MemberInfo *mi; for (;(mi=mnii.current());++mnii) { //printf("Adding!\n"); MemberInfo *newMi=new MemberInfo(mi->memberDef,mi->prot,mi->virt,mi->inherited); newMi->scopePath=mi->scopePath; newMi->ambigClass=mi->ambigClass; newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy(); newMni->append(newMi); } // add it to the dictionary dstMnd->append(newMni->memberName(),newMni); } } } } //---------------------------------------------------------------------------- void ClassDef::addUsedClass(ClassDef *cd,const char *accessName) { //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_impl->usesImplClassDict==0) { m_impl->usesImplClassDict = new UsesClassDict(17); m_impl->usesImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name()); if (ucd==0) { ucd = new UsesClassDef(cd); m_impl->usesImplClassDict->insert(cd->name(),ucd); //printf("Adding used class %s to class %s\n", // cd->name().data(),name().data()); } ucd->addAccessor(accessName); } void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName) { if (m_impl->usedByImplClassDict==0) { m_impl->usedByImplClassDict = new UsesClassDict(17); m_impl->usedByImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usedByImplClassDict->find(cd->name()); if (ucd==0) { ucd = new UsesClassDef(cd); m_impl->usedByImplClassDict->insert(cd->name(),ucd); //printf("Adding used by class %s to class %s\n", // cd->name().data(),name().data()); } ucd->addAccessor(accessName); } #if 0 /*! Builds up a dictionary of all classes that are used by the state of this * class (the "implementation"). * Must be called before mergeMembers() is called! */ void ClassDef::determineImplUsageRelation() { MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict); MemberNameInfo *mni; for (;(mni=mnili.current());++mnili) { MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { MemberDef *md=mi->memberDef; if (md->isVariable()) // for each member variable in this class { QCString type=removeRedundantWhiteSpace(md->typeString()); //printf("in class %s found var type=`%s' name=`%s'\n", // name().data(),type.data(),md->name().data()); int pos=0; QCString usedClassName; QCString templSpec; bool found=FALSE; while (extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1 && !found) { //printf("usedClassName=`%s' templSpec=%s\n",usedClassName.data(),templSpec.data()); // check if usedClassName is a template argument of its class ClassDef *cd=md->getClassDef(); if (cd && cd->templateArguments()) { ArgumentListIterator ali(*cd->templateArguments()); Argument *arg; int count=0; for (ali.toFirst();(arg=ali.current());++ali,++count) { if (arg->name==usedClassName) // type is a template argument { found=TRUE; if (m_impl->usesImplClassDict==0) m_impl->usesImplClassDict = new UsesClassDict(257); cd = new ClassDef(cd->getDefFileName(),cd->getDefLine(), usedClassName,ClassDef::Class); cd->setIsTemplateBaseClass(count); UsesClassDef *ucd = new UsesClassDef(cd); m_impl->usesImplClassDict->insert(cd->name(),ucd); ucd->templSpecifiers = templSpec; ucd->addAccessor(md->name()); Doxygen::hiddenClasses.append(cd); //printf("Adding used template argument %s to class %s\n", // cd->name().data(),name().data()); //printf("Adding accessor %s to class %s\n", // md->name().data(),ucd->classDef->name().data()); } } } if (!found) { cd=0; if (getNamespaceDef()!=0) { cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec); } if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec); if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try inbetween scopes! //printf("Search for class %s result=%p\n",usedClassName.data(),cd); if (cd) // class exists { found=TRUE; if (m_impl->usesImplClassDict==0) { m_impl->usesImplClassDict = new UsesClassDict(257); m_impl->usesImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_impl->usesImplClassDict->find(cd->name()); if (ucd==0 || ucd->templSpecifiers!=templSpec) { ucd = new UsesClassDef(cd); m_impl->usesImplClassDict->insert(cd->name(),ucd); ucd->templSpecifiers = templSpec; //printf("Adding used class %s to class %s\n", // cd->name().data(),name().data()); } ucd->addAccessor(md->name()); //printf("Adding accessor %s to class %s\n", // md->name().data(),ucd->classDef->name().data()); } } } } } } #ifdef DUMP if (m_impl->usesClassDict) { msg("Class %s uses the following classes:\n",name().data()); UsesClassDictIterator ucdi(*m_impl->usesClassDict); UsesClassDef *ucd; for (;(ucd=ucdi.current());++ucdi) { msg(" %s via ",ucd->classDef->name().data()); QDictIterator<void> dvi(*ucd->accessors); const char *s; for (;(s=dvi.currentKey());++dvi) { msg("%s ",s); } msg("\n"); } } #endif } //---------------------------------------------------------------------------- // I have disabled this code because the graphs it renders quickly become // too large to be of practical use. void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr) { QCString type = typeStr; static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); int p=0,i,l; while ((i=re.match(type,p,&l))!=-1) // for each class name in the type { ClassDef *cd=getClass(name()+"::"+type.mid(i,l)); if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try inbetween scopes! if (cd && cd!=this && !isBaseClass(cd)) { if (m_impl->usesIntfClassDict==0) { m_impl->usesIntfClassDict = new UsesClassDict(257); } UsesClassDef *ucd=m_impl->usesIntfClassDict->find(cd->name()); if (ucd==0) { ucd = new UsesClassDef(cd); m_impl->usesIntfClassDict->insert(cd->name(),ucd); //printf("in class `%s' adding used intf class `%s'\n", // name().data(),cd->name().data()); } ucd->addAccessor(md->name()); //printf("in class `%s' adding accessor `%s' to class `%s'\n", // name().data(),md->name().data(),ucd->classDef->name().data()); } p=i+l; } } void ClassDef::determineIntfUsageRelation() { MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoList); MemberNameInfo *mni; for (;(mni=mnili.current());++mnili) { MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { MemberDef *md=mi->memberDef; // compute the protection level for this member Protection protect=md->protection(); if (mi->prot==Protected) // inherited protection { if (protect==Public) protect=Protected; else if (protect==Protected) protect=Private; } if (!md->name().isEmpty() && md->name()[0]!='@' && (mi->prot!=Private && protect!=Private) ) { // add classes found in the return type addUsedInterfaceClasses(md,md->typeString()); ArgumentList *al = md->argumentList(); if (al) // member has arguments { // add classes found in the types of the argument list ArgumentListIterator ali(*al); Argument *a; for (;(a=ali.current());++ali) { if (!a->type.isEmpty() && a->type.at(0)!='@') { addUsedInterfaceClasses(md,a->type); } } } } } } } #endif QCString ClassDef::compoundTypeString() const { if (m_impl->compType==Interface && m_impl->isObjC) return "class"; switch (m_impl->compType) { case Class: return "class"; case Struct: return "struct"; case Union: return "union"; case Interface: return "interface"; case Protocol: return "protocol"; case Category: return "category"; case Exception: return "exception"; default: return "unknown"; } } QCString ClassDef::getOutputFileBase() const { if (m_impl->templateMaster) { return m_impl->templateMaster->getOutputFileBase(); } else if (isReference()) { return m_impl->fileName; } else { return convertNameToFile(m_impl->fileName); } } QCString ClassDef::getInstanceOutputFileBase() const { if (isReference()) { return m_impl->fileName; } else { return convertNameToFile(m_impl->fileName); } } QCString ClassDef::getFileBase() const { if (m_impl->templateMaster) { return m_impl->templateMaster->getFileBase(); } else { return m_impl->fileName; } } QCString ClassDef::getSourceFileBase() const { if (m_impl->templateMaster) { return m_impl->templateMaster->getSourceFileBase(); } else { return convertNameToFile(m_impl->fileName+"-source"); } } void ClassDef::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs) { gd->addClass(this); //printf("ClassDef::setGroupDefForAllMembers(%s)\n",gd->name().data()); if (m_impl->allMemberNameInfoSDict==0) return; MemberNameInfoSDict::Iterator mnili(*m_impl->allMemberNameInfoSDict); MemberNameInfo *mni; for (;(mni=mnili.current());++mnili) { MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { MemberDef *md=mi->memberDef; md->setGroupDef(gd,pri,fileName,startLine,hasDocs); gd->insertMember(md,TRUE); ClassDef *innerClass = md->getClassDefOfAnonymousType(); if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs); } } } void ClassDef::addInnerCompound(Definition *d) { //printf("**** %s::addInnerCompound(%s)\n",name().data(),d->name().data()); if (d->definitionType()==Definition::TypeClass) // only classes can be // nested in classes. { if (m_impl->innerClasses==0) { m_impl->innerClasses = new ClassSDict(17); } m_impl->innerClasses->inSort(d->localName(),(ClassDef *)d); } } Definition *ClassDef::findInnerCompound(const char *name) { Definition *result=0; if (name==0) return 0; if (m_impl->innerClasses) { result = m_impl->innerClasses->find(name); } return result; } //void ClassDef::initTemplateMapping() //{ // m_impl->templateMapping->clear(); // ArgumentList *al = templateArguments(); // if (al) // { // ArgumentListIterator ali(*al); // Argument *arg; // for (ali.toFirst();(arg=ali.current());++ali) // { // setTemplateArgumentMapping(arg->name,arg->defval); // } // } //} //void ClassDef::setTemplateArgumentMapping(const char *formal,const char *actual) //{ // //printf("ClassDef::setTemplateArgumentMapping(%s,%s)\n",formal,actual); // if (m_impl->templateMapping && formal) // { // if (m_impl->templateMapping->find(formal)) // { // m_impl->templateMapping->remove(formal); // } // m_impl->templateMapping->insert(formal,new QCString(actual)); // } //} // //QCString ClassDef::getTemplateArgumentMapping(const char *formal) const //{ // if (m_impl->templateMapping && formal) // { // QCString *s = m_impl->templateMapping->find(formal); // if (s) // { // return *s; // } // } // return ""; //} ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, int startLine, const QCString &templSpec,bool &freshInstance) { freshInstance = FALSE; if (m_impl->templateInstances==0) { m_impl->templateInstances = new QDict<ClassDef>(17); } ClassDef *templateClass=m_impl->templateInstances->find(templSpec); if (templateClass==0) { Debug::print(Debug::Classes,0," New template instance class `%s'`%s'\n",name().data(),templSpec.data()); templateClass = new ClassDef( fileName,startLine,name()+templSpec,ClassDef::Class); templateClass->setTemplateMaster(this); templateClass->setOuterScope(getOuterScope()); templateClass->setHidden(isHidden()); m_impl->templateInstances->insert(templSpec,templateClass); freshInstance=TRUE; } return templateClass; } ClassDef *ClassDef::getVariableInstance(const char *templSpec) { if (m_impl->variableInstances==0) { m_impl->variableInstances = new QDict<ClassDef>(17); m_impl->variableInstances->setAutoDelete(TRUE); } ClassDef *templateClass=m_impl->variableInstances->find(templSpec); if (templateClass==0) { Debug::print(Debug::Classes,0," New template variable instance class `%s'`%s'\n",name().data(),templSpec); templateClass = new ClassDef("<code>",1,name()+templSpec, ClassDef::Class,0,0,FALSE); templateClass->addMembersToTemplateInstance( this, templSpec ); templateClass->setTemplateMaster(this); m_impl->variableInstances->insert(templSpec,templateClass); } return templateClass; } void ClassDef::setTemplateBaseClassNames(QDict<int> *templateNames) { if (templateNames==0) return; if (m_impl->templBaseClassNames==0) { m_impl->templBaseClassNames = new QDict<int>(17); m_impl->templBaseClassNames->setAutoDelete(TRUE); } // make a deep copy of the dictionary. QDictIterator<int> qdi(*templateNames); for (;qdi.current();++qdi) { if (m_impl->templBaseClassNames->find(qdi.currentKey())==0) { m_impl->templBaseClassNames->insert(qdi.currentKey(),new int(*qdi.current())); } } } QDict<int> *ClassDef::getTemplateBaseClassNames() const { return m_impl->templBaseClassNames; } void ClassDef::addMembersToTemplateInstance(ClassDef *cd,const char *templSpec) { //printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec); if (cd->memberNameInfoSDict()==0) return; MemberNameInfoSDict::Iterator mnili(*cd->memberNameInfoSDict()); MemberNameInfo *mni; for (;(mni=mnili.current());++mnili) { MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { ArgumentList *actualArguments = new ArgumentList; stringToArgumentList(templSpec,actualArguments); MemberDef *md = mi->memberDef; MemberDef *imd = md->createTemplateInstanceMember( cd->templateArguments(),actualArguments); delete actualArguments; //printf("%s->setMemberClass(%p)\n",imd->name().data(),this); imd->setMemberClass(this); imd->setTemplateMaster(md); imd->setDocumentation(md->documentation(),md->docFile(),md->docLine()); imd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine()); imd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine()); imd->setMemberSpecifiers(md->getMemberSpecifiers()); imd->setMemberGroupId(md->getMemberGroupId()); insertMember(imd); //printf("Adding member=%s %s%s to class %s templSpec %s\n", // imd->typeString(),imd->name().data(),imd->argsString(), // imd->getClassDef()->name().data(),templSpec); // insert imd in the list of all members //printf("Adding member=%s class=%s\n",imd->name().data(),name().data()); MemberName *mn = Doxygen::memberNameSDict->find(imd->name()); if (mn==0) { mn = new MemberName(imd->name()); Doxygen::memberNameSDict->append(imd->name(),mn); } mn->append(imd); } } } QCString ClassDef::getReference() const { if (m_impl->templateMaster) { return m_impl->templateMaster->getReference(); } else { return Definition::getReference(); } } bool ClassDef::isReference() const { if (m_impl->templateMaster) { return m_impl->templateMaster->isReference(); } else { return Definition::isReference(); } } void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const { Definition *d=getOuterScope(); if (d) { if (d->definitionType()==Definition::TypeClass) { ClassDef *cd=(ClassDef *)d; cd->getTemplateParameterLists(lists); } } if (templateArguments()) { lists.append(templateArguments()); } } QCString ClassDef::qualifiedNameWithTemplateParameters( QList<ArgumentList> *actualParams) const { static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); //printf("qualifiedNameWithTemplateParameters() localName=%s\n",localName().data()); QCString scName; Definition *d=getOuterScope(); if (d) { if (d->definitionType()==Definition::TypeClass) { ClassDef *cd=(ClassDef *)d; scName = cd->qualifiedNameWithTemplateParameters(actualParams); } else { scName = d->qualifiedName(); } } QCString scopeSeparator; if (optimizeOutputJava) scopeSeparator="."; else scopeSeparator="::"; if (!scName.isEmpty()) scName+=scopeSeparator; scName+=localName(); ArgumentList *al=0; bool isSpecialization = localName().find('<')!=-1; if (templateArguments()) { if (actualParams && (al=actualParams->current())) { if (!isSpecialization) { scName+=tempArgListToString(al); } actualParams->next(); } else { if (!isSpecialization) { scName+=tempArgListToString(templateArguments()); } } } //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",name().data(),scName.data()); return scName; } QCString ClassDef::className() const { return m_impl->className; }; void ClassDef::addListReferences() { if (!isLinkableInProject()) return; //printf("ClassDef(%s)::addListReferences()\n",name().data()); { LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems(); addRefItem(xrefItems.pointer(), theTranslator->trClass(TRUE,TRUE), getOutputFileBase(),displayName() ); } if (m_impl->memberGroupSDict) { MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) { mg->addListReferences(this); } } QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if (ml->listType()&MemberList::detailedLists) { ml->addListReferences(this); } } } MemberDef *ClassDef::getMemberByName(const QCString &name) const { MemberDef *xmd = 0; if (m_impl->allMemberNameInfoSDict) { MemberNameInfo *mni = m_impl->allMemberNameInfoSDict->find(name); if (mni) { const int maxInheritanceDepth = 100000; int mdist=maxInheritanceDepth; MemberNameInfoIterator mnii(*mni); MemberInfo *mi; for (mnii.toFirst();(mi=mnii.current());++mnii) { ClassDef *mcd=mi->memberDef->getClassDef(); int m=minClassDistance(this,mcd); //printf("found member in %s linkable=%d m=%d\n", // mcd->name().data(),mcd->isLinkable(),m); if (m<mdist && mcd->isLinkable()) { mdist=m; xmd=mi->memberDef; } } } } //printf("getMemberByName(%s)=%p\n",name.data(),xmd); return xmd; } bool ClassDef::isAccessibleMember(MemberDef *md) { return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE); } MemberList *ClassDef::createMemberList(MemberList::ListType lt) { m_impl->memberLists.setAutoDelete(TRUE); QListIterator<MemberList> mli(m_impl->memberLists); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if (ml->listType()==lt) { return ml; } } // not found, create a new member list ml = new MemberList(lt); m_impl->memberLists.append(ml); return ml; } MemberList *ClassDef::getMemberList(MemberList::ListType lt) { MemberList *ml = m_impl->memberLists.first(); while (ml) { if (ml->listType()==lt) { return ml; } ml = m_impl->memberLists.next(); } return 0; } void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md) { static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS"); MemberList *ml = createMemberList(lt); if (sortBriefDocs) ml->inSort(md); else ml->append(md); // for members in the declaration lists we set the section, needed for member grouping if ((ml->listType()&MemberList::detailedLists)==0) md->setSectionList(this,ml); } void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title, const char *subTitle) { MemberList * ml = getMemberList(lt); if (ml) ml->writeDeclarations(ol,this,0,0,0,title,subTitle); } void ClassDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title) { MemberList * ml = getMemberList(lt); if (ml) ml->writeDocumentation(ol,name(),this,title); } void ClassDef::writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup) { MemberList * ml = getMemberList(lt); if (ml) { ml->setInGroup(inGroup); ml->writePlainDeclarations(ol,this,0,0,0); } } bool ClassDef::isLocal() const { return m_impl->isLocal; } bool ClassDef::isArtificial() const { return m_impl->artificial; } ClassSDict *ClassDef::getInnerClasses() { return m_impl->innerClasses; } ClassDef::CompoundType ClassDef::compoundType() const { return m_impl->compType; } BaseClassList *ClassDef::baseClasses() const { return m_impl->inherits; } BaseClassList *ClassDef::subClasses() const { return m_impl->inheritedBy; } MemberNameInfoSDict *ClassDef::memberNameInfoSDict() const { return m_impl->allMemberNameInfoSDict; } Protection ClassDef::protection() const { return m_impl->prot; } ArgumentList *ClassDef::templateArguments() const { return m_impl->tempArgs; } NamespaceDef *ClassDef::getNamespaceDef() const { return m_impl->nspace; } FileDef *ClassDef::getFileDef() const { return m_impl->fileDef; } QDict<ClassDef> *ClassDef::getTemplateInstances() const { return m_impl->templateInstances; } ClassDef *ClassDef::templateMaster() const { return m_impl->templateMaster; } bool ClassDef::isTemplate() const { return m_impl->tempArgs!=0; } IncludeInfo *ClassDef::includeInfo() const { return m_impl->incInfo; } UsesClassDict *ClassDef::usedImplementationClasses() const { return m_impl->usesImplClassDict; } UsesClassDict *ClassDef::usedByImplementationClasses() const { return m_impl->usedByImplClassDict; } UsesClassDict *ClassDef::usedInterfaceClasses() const { return m_impl->usesIntfClassDict; } bool ClassDef::isTemplateArgument() const { return m_impl->isTemplArg; } bool ClassDef::isAbstract() const { return m_impl->isAbstract; } bool ClassDef::isObjectiveC() const { return m_impl->isObjC; } ClassDef *ClassDef::categoryOf() const { return m_impl->categoryOf; } const QList<MemberList> &ClassDef::getMemberLists() const { return m_impl->memberLists; } MemberGroupSDict *ClassDef::getMemberGroupSDict() const { return m_impl->memberGroupSDict; } void ClassDef::setNamespace(NamespaceDef *nd) { m_impl->nspace = nd; } void ClassDef::setFileDef(FileDef *fd) { m_impl->fileDef=fd; } void ClassDef::setSubGrouping(bool enabled) { m_impl->subGrouping = enabled; } void ClassDef::setProtection(Protection p) { m_impl->prot=p; } void ClassDef::setClassIsArtificial() { m_impl->artificial = TRUE; } void ClassDef::setIsStatic(bool b) { m_impl->isStatic=b; } void ClassDef::setIsObjectiveC(bool b) { m_impl->isObjC=b; } void ClassDef::setCompoundType(CompoundType t) { m_impl->compType = t; } void ClassDef::setTemplateMaster(ClassDef *tm) { m_impl->templateMaster=tm; } void ClassDef::makeTemplateArgument(bool b) { m_impl->isTemplArg = b; } void ClassDef::setCategoryOf(ClassDef *cd) { m_impl->categoryOf = cd; } void ClassDef::setUsedOnly(bool b) { m_impl->usedOnly = b; } bool ClassDef::isUsedOnly() const { return m_impl->usedOnly; }