$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r65632 - sandbox/variadic_templates/libs/composite_storage/sandbox/pack
From: cppljevans_at_[hidden]
Date: 2010-09-27 12:02:18
Author: cppljevans
Date: 2010-09-27 12:02:15 EDT (Mon, 27 Sep 2010)
New Revision: 65632
URL: http://svn.boost.org/trac/boost/changeset/65632
Log:
WHAT:
  1) Added comments explaining why empties_tree_inherit size>1.
  2) Added enum_base<index0> speecialization.
WHY:
  1) Clarify why using inheritance to achive EBO only works
     with 1 level of inheritance.
  2) Show further saving of one_of_maybe vs. variant.
OUTPUT:
sizeof(empty_class<0>)=1
sizeof(index_inherit<0,empties_inherit>)=1
sizeof(empties_inherit)=1
sizeof(empties_tree_inherit)=2
sizeof(empties_member)=2
sizeof(empties_all_of)=1
sizeof(empties_tree_all_of)=1
sizeof(empties_variant)=8
sizeof(empties_one_of)=1
sizeof(enum_base<index0>::type)=1
p0=0x7fffefb05f6f
p1=0x7fffefb05f6f
*p0=empty_class<0>const&
*p1=empty_class<1>const&
r0=empty_class<0>const&
r1=empty_class<1>const&
&ea_v=0x7fffefb05f6e
&r0=0x7fffefb05f6e
&r1=0x7fffefb05f6e
r1.get()=1
Text files modified: 
   sandbox/variadic_templates/libs/composite_storage/sandbox/pack/empty_base.cpp |    53 ++++++++++++++++++++++++++++----------- 
   1 files changed, 38 insertions(+), 15 deletions(-)
Modified: sandbox/variadic_templates/libs/composite_storage/sandbox/pack/empty_base.cpp
==============================================================================
--- sandbox/variadic_templates/libs/composite_storage/sandbox/pack/empty_base.cpp	(original)
+++ sandbox/variadic_templates/libs/composite_storage/sandbox/pack/empty_base.cpp	2010-09-27 12:02:15 EDT (Mon, 27 Sep 2010)
@@ -1,13 +1,8 @@
 //Purpose:
-//  See if more than 1 empty base types contribute 
-//  more to size of derived type than just 1
-//  empty_base type.
-//Result:
-//  No. Output is:
-//    sizeof(empty_class<0>)=1
-//    sizeof(empties_inherits)=1
-//    sizeof(empties_member)=2
-//    sizeof(empties_all_of)=1
+//  Demostrate effect of using empty base class
+//  in various constructs.
+//Reference:
+//  [EBO] http://www.cantrip.org/emptyopt.html
 //
 #include <boost/composite_storage/pack/container_all_of_aligned.hpp>
 #include <boost/composite_storage/pack/container_one_of_maybe.hpp>
@@ -18,6 +13,9 @@
   < unsigned I
   >
 struct empty_class
+/**@brief
+ *  This is an empty class, according to:
+ */
 {
         friend
       std::ostream&
@@ -34,15 +32,15 @@
     {
         return I;
     }
-  #if 0
-    unsigned my_i;
-    empty_class(void):my_i(I){}
-  #endif
 };
 
 struct empties_inherit
 : empty_class<0>
 , empty_class<1>
+/*@brief
+ *  According to [EBO] this class is not an empty class 
+ *  because its sequence of base class objects is not empty.
+ */
 {};
 
 template<unsigned I, typename T>
@@ -53,6 +51,11 @@
 struct empties_tree_inherit
 : index_inherit<0,empties_inherit>
 , index_inherit<1,empties_inherit>
+/**@brief
+ *  Since empties_inherit is not an empty class,
+ *  the empty-base-class-optimization doesn't apply here;
+ *  hence sizeof(empties_tree_inherit)>1.
+ */
 {};
 
 struct empties_member
@@ -60,10 +63,28 @@
   empty_class<0> m0;
   empty_class<1> m1;
 };
+
+    typedef
+  char
+index_type
+;
     typedef
-  boost::mpl::integral_c<unsigned,0>
+  boost::mpl::integral_c<index_type,index_type(0)>
 index0
 ;  
+namespace boost
+{
+namespace composite_storage
+{
+  template<>
+  struct enum_base<index0>
+  {
+          typedef 
+        char //save space in one_of_maybe
+      type;
+  };
+}
+}
     typedef
   boost::composite_storage::pack::container
   < boost::composite_storage::tags::all_of_aligned
@@ -101,13 +122,15 @@
 int main(void)
 {
     std::cout<<"sizeof(empty_class<0>)="<<sizeof(empty_class<0>)<<"\n";
+    std::cout<<"sizeof(index_inherit<0,empties_inherit>)="
+      <<sizeof(index_inherit<0,empties_inherit>)<<"\n";
     std::cout<<"sizeof(empties_inherit)="<<sizeof(empties_inherit)<<"\n";
     std::cout<<"sizeof(empties_tree_inherit)="<<sizeof(empties_tree_inherit)<<"\n";
     std::cout<<"sizeof(empties_member)="<<sizeof(empties_member)<<"\n";
     std::cout<<"sizeof(empties_all_of)="<<sizeof(empties_all_of)<<"\n";
     std::cout<<"sizeof(empties_tree_all_of)="<<sizeof(empties_tree_all_of)<<"\n";
-    std::cout<<"sizeof(empties_one_of)="<<sizeof(empties_one_of)<<"\n";
     std::cout<<"sizeof(empties_variant)="<<sizeof(empties_variant)<<"\n";
+    std::cout<<"sizeof(empties_one_of)="<<sizeof(empties_one_of)<<"\n";
     std::cout
       <<"sizeof(enum_base<index0>::type)="
       <<sizeof(boost::composite_storage::enum_base<index0>::type)<<"\n";