Click here to Skip to main content
15,892,674 members
Articles / Programming Languages / C++

RCF - Interprocess Communication for C++

Rate me:
Please Sign up or sign in to vote.
4.94/5 (147 votes)
25 Oct 2011CPOL20 min read 4.6M   8.4K   331  
A server/client IPC framework, using the C++ preprocessor as an IDL compiler.
%!PS-Adobe-2.0 EPSF-2.0
%%Title: ClassName
%%Creator: Doxygen
%%CreationDate: Time
%%For: 
%Magnification: 1.00
%%Orientation: Portrait
%%BoundingBox: 0 0 500 242.424
%%Pages: 0
%%BeginSetup
%%EndSetup
%%EndComments

% ----- variables -----

/boxwidth 0 def
/boxheight 40 def
/fontheight 24 def
/marginwidth 10 def
/distx 20 def
/disty 40 def
/boundaspect 2.0625 def  % aspect ratio of the BoundingBox (width/height)
/boundx 500 def
/boundy boundx boundaspect div def
/xspacing 0 def
/yspacing 0 def
/rows 2 def
/cols 1 def
/scalefactor 0 def
/boxfont /Times-Roman findfont fontheight scalefont def

% ----- procedures -----

/dotted { [1 4] 0 setdash } def
/dashed { [5] 0 setdash } def
/solid  { [] 0 setdash } def

/max % result = MAX(arg1,arg2)
{
  /a exch def
  /b exch def
  a b gt {a} {b} ifelse
} def

/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
{
  0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
} def

/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
{
  /str exch def
  /boxwidth boxwidth str stringwidth pop max def
} def

/box % draws a box with text `arg1' at grid pos (arg2,arg3)
{ gsave
  2 setlinewidth
  newpath
  exch xspacing mul xoffset add
  exch yspacing mul
  moveto
  boxwidth 0 rlineto 
  0 boxheight rlineto 
  boxwidth neg 0 rlineto 
  0 boxheight neg rlineto 
  closepath
  dup stringwidth pop neg boxwidth add 2 div
  boxheight fontheight 2 div sub 2 div
  rmoveto show stroke
  grestore
} def  

/mark
{ newpath
  exch xspacing mul xoffset add boxwidth add
  exch yspacing mul
  moveto
  0 boxheight 4 div rlineto
  boxheight neg 4 div boxheight neg 4 div rlineto
  closepath
  eofill
  stroke
} def

/arrow
{ newpath
  moveto
  3 -8 rlineto
  -6 0 rlineto
  3 8 rlineto
  closepath
  eofill
  stroke
} def

/out % draws an output connector for the block at (arg1,arg2)
{
  newpath
  exch xspacing mul xoffset add boxwidth 2 div add
  exch yspacing mul boxheight add
  /y exch def
  /x exch def
  x y moveto
  0 disty 2 div rlineto 
  stroke
  1 eq { x y disty 2 div add arrow } if
} def

/in % draws an input connector for the block at (arg1,arg2)
{
  newpath
  exch xspacing mul xoffset add boxwidth 2 div add
  exch yspacing mul disty 2 div sub
  /y exch def
  /x exch def
  x y moveto
  0 disty 2 div rlineto
  stroke
  1 eq { x y disty 2 div add arrow } if
} def

/hedge
{
  exch xspacing mul xoffset add boxwidth 2 div add
  exch yspacing mul boxheight 2 div sub
  /y exch def
  /x exch def
  newpath
  x y moveto
  boxwidth 2 div distx add 0 rlineto
  stroke
  1 eq
  { newpath x boxwidth 2 div distx add add y moveto
    -8 3 rlineto
    0 -6 rlineto
    8 3 rlineto
    closepath
    eofill
    stroke
  } if
} def

/vedge
{
  /ye exch def
  /ys exch def
  /xs exch def
  newpath
  xs xspacing mul xoffset add boxwidth 2 div add dup
  ys yspacing mul boxheight 2 div sub
  moveto
  ye yspacing mul boxheight 2 div sub
  lineto
  stroke
} def

/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'
{
  /ys exch def
  /xe exch def
  /xs exch def
  newpath
  xs xspacing mul xoffset add boxwidth 2 div add
  ys yspacing mul disty 2 div sub
  moveto
  xspacing xe xs sub mul 0
  rlineto
  stroke
} def

% ----- main ------

boxfont setfont
1 boundaspect scale
(RCF::SubscriptionService) cw
(RCF::I_Service) cw
/boxwidth boxwidth marginwidth 2 mul add def
/xspacing boxwidth distx add def
/yspacing boxheight disty add def
/scalefactor 
  boxwidth cols mul distx cols 1 sub mul add
  boxheight rows mul disty rows 1 sub mul add boundaspect mul 
  max def
boundx scalefactor div boundy scalefactor div scale

% ----- classes -----

 (RCF::SubscriptionService) 0 0 box
 (RCF::I_Service) 0 1 box

% ----- relations -----

solid
0 0 0 out
solid
1 0 1 in

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Australia Australia
Software developer, from Sweden and now living in Canberra, Australia, working on distributed C++ applications. When he is not programming, Jarl enjoys skiing and playing table tennis. He derives immense satisfaction from referring to himself in third person.

Comments and Discussions