# CStruct Examples
require 'cstruct'

# example:
# struct Point in C\C++ (32-bit platform): 
#
# struct Point
# {
#    int x;
#    int y;
# }; 
#
# struct Line in C\C++ (32-bit platform): 
#
# struct Line
# {
#    Point begin_point;
#    Point end_point;
# }; 

# struct TwoLine in C\C++ (32-bit platform): 
#
# struct TwoLine
# {
#    Line lines[2];
# }; 



# struct Point , Line and TwoLine in Ruby: 
class Point < CStruct
  int32:x
  int32:y 
end

class Line < CStruct
  Point:begin_point
  Point:end_point 
end

class TwoLine < CStruct
  Line:lines,[2]
end


line = Line.new

# assign like as C language
line.begin_point.x = 0
line.begin_point.y = 0
line.end_point.x = 20   
line.end_point.y = 30


puts "sizeof(Line) = #{Line.__size__}" # "__size__" is alias of "size"
puts "line.begin_point.x = #{line.begin_point.x}"
puts "line.begin_point.y = #{line.begin_point.y}"
puts "line.end_point.x = #{line.end_point.x}"  
puts "line.end_point.y = #{line.end_point.y}"

two_line = TwoLine.new

# assign like as C language
two_line.lines[0].begin_point.x = 6
two_line.lines[0].begin_point.y = 16
two_line.lines[0].end_point.x = 26   
two_line.lines[0].end_point.y = 36

two_line.lines[1].begin_point.x = 6
two_line.lines[1].begin_point.y = 16
two_line.lines[1].end_point.x = 26   
two_line.lines[1].end_point.y = 36