#line 1 "ah_construction/main.cc"
#ifndef __ac_FIRST__home_Tom_aspectcX43X43__
#define __ac_FIRST__home_Tom_aspectcX43X43__
#define __ac_FIRST_FILE__home_Tom_aspectcX43X43_ah_construction_main_cc__
#ifndef __ac_have_predefined_includes__
#define __ac_have_predefined_includes__
#endif // __ac_have_predefined_includes__

#ifndef __ac_h_
#define __ac_h_
#ifdef __cplusplus
namespace AC {
  typedef const char* Type;
  enum JPType { CALL = 262144, EXECUTION = 16777216, CONSTRUCTION = 33554432, DESTRUCTION = 67108864 };
  enum Protection { PROT_NONE, PROT_PRIVATE, PROT_PROTECTED, PROT_PUBLIC };
  enum Specifiers { SPEC_NONE = 0x0 , SPEC_STATIC = 0x1, SPEC_MUTABLE = 0x2, SPEC_VIRTUAL = 0x4 };
  struct Action {
    void **_args; void *_result; void *_entity; void *_target; void *_that; void *_fptr;
    void (*_wrapper)(Action &);
    inline void trigger () { _wrapper (*this); }
  };
  template <typename T> struct ResultBuffer {
    char _data[sizeof (T)];
    void operator = (const T& t) { *this = (const ResultBuffer &)t; }
  };
  template <typename T, typename N> struct TL {
    typedef T type; typedef N next; enum { ARGS = next::ARGS + 1 };
  };
  struct TLE { enum { ARGS = 0 }; };
  template <typename T> struct Referred { typedef T type; };
  template <typename T> struct Referred<T &> { typedef T type; };
  template <typename TL, int I> struct Arg {
    typedef typename Arg<typename TL::next, I - 1>::Type Type;
    typedef typename Referred<Type>::type ReferredType;
  };
  template <typename TL> struct Arg<TL, 0> {
    typedef typename TL::type Type;
    typedef typename Referred<Type>::type ReferredType;
  };
  template <typename T> int ttest(...);
  template <typename T> char ttest(typename T::__TI const volatile *);
  template<typename T> struct HasTypeInfo {
    enum { RET=((sizeof(ttest<T>(0))==1)?1:0) };
  };
  template<typename T, int HAVE = HasTypeInfo<T>::RET> struct TypeInfo {
    enum { AVAILABLE = 0, BASECLASSES = 0, MEMBERS = 0, FUNCTIONS = 0,
           CONSTRUCTORS = 0, DESTRUCTORS = 0 };
    typedef T That;
  };
  template<typename T> struct TypeInfo<T, 1> : T::__TI {
    enum { AVAILABLE = 1 };
  };
  template<typename T> struct RT {};
  template<typename T> RT<T> rt_deduce (const T&) { return RT<T>(); }
  template<typename T> RT<T> rt_deduce (const volatile T&) { return RT<T>(); }
  struct Cnv { template<typename T> operator RT<T>() const { return RT<T>(); }};
  #define __AC_TYPEOF(expr) (1?AC::Cnv():AC::rt_deduce(expr))
  template <class Aspect, int Index>
  struct CFlow {
    static int &instance () {
      static int counter = 0;
      return counter;
    }
    CFlow () { instance ()++; }
    ~CFlow () { instance ()--; }
    static bool active () { return instance () > 0; }
  };

#ifdef __acdef_float
template <typename BASE, int ID=0> struct _FloatN {
  BASE val;
  _FloatN() {}
  _FloatN(const BASE& v) : val(v) {}
  operator BASE() const { return val; }
};
#endif
}

#ifdef __acdef_float
typedef AC::_FloatN<float> _Float32;
typedef AC::_FloatN<double> _Float32x;
typedef AC::_FloatN<long double, 0> _Float64;
typedef AC::_FloatN<long double, 1> _Float128;
typedef AC::_FloatN<long double, 2> _Float64x;
#endif

#if defined(__acweaving) && defined(__ARM_NEON)
typedef __attribute__ ((__neon_vector_type__ (4))) float __Float32x4_t;
typedef __attribute__ ((__neon_vector_type__ (2))) double __Float64x2_t;
#endif
#endif // __cplusplus
#endif // __ac_h_
class Hello;
#endif // __ac_FIRST__home_Tom_aspectcX43X43__
#line 96 "main.acc"

#ifndef __ac_fwd_Hello__
#define __ac_fwd_Hello__
class Hello;
namespace AC {
  __attribute((always_inline)) inline void invoke_Hello_Hello__a0_after ();
}
#endif

#ifndef __ac_need__home_Tom_aspectcX43X43_ah_construction_hello_world_ah__
#define __ac_need__home_Tom_aspectcX43X43_ah_construction_hello_world_ah__
#endif

#line 1 "ah_construction/main.cc"

#line 1 "ah_construction/main.cc"
class World{
#line 114 "main.acc"
public:
  template <typename, int = 0> struct __BYPASSWorld {};
  template <typename, int> friend struct __BYPASSWorld;
private:
#line 1 "ah_construction/main.cc"

#line 1 "ah_construction/main.cc"

  public: World()
#line 124 "main.acc"
{
    this->__exec_old_C1();
  AC::invoke_Hello_Hello__a0_after ();
  
}
__attribute__((always_inline)) inline void __exec_old_C1()
#line 2 "ah_construction/main.cc"

#line 2 "ah_construction/main.cc"
{}
#line 135 "main.acc"

public:
inline World (const ::World&)  {
  AC::invoke_Hello_Hello__a0_after ();

}

#line 3 "ah_construction/main.cc"

#line 3 "ah_construction/main.cc"
#line 146 "main.acc"

  friend class ::Hello;

#line 3 "ah_construction/main.cc"

#line 3 "ah_construction/main.cc"
};

int main(){
  World(); //Create a World Object
  return 0;
}
#line 159 "main.acc"

#ifndef __ac_have_predefined_includes__
/*** begin of aspect includes ***/
// commented out by ac++: #include "hello_world.ah"
/*** end of aspect includes ***/
#endif
#line 9 "ah_construction/main.cc"

#line 9 "ah_construction/main.cc"

#ifdef __ac_FIRST_FILE__home_Tom_aspectcX43X43_ah_construction_main_cc__
#ifdef __ac_need__home_Tom_aspectcX43X43_ah_construction_hello_world_ah__
#ifndef __ac_have__home_Tom_aspectcX43X43_ah_construction_hello_world_ah__
#define __ac_have__home_Tom_aspectcX43X43_ah_construction_hello_world_ah__
// commented out by ac++: #include "hello_world.ah"
#line 1 "ah_construction/hello_world.ah"
#ifndef __WORLD_AH__
#define __WORLD_AH__

#include <iostream>

class Hello {
#line 182 "main.acc"
public:
  template <typename, int = 0> struct __BYPASSHello {};
  template <typename, int> friend struct __BYPASSHello;
private:
#line 6 "ah_construction/hello_world.ah"

#line 6 "ah_construction/hello_world.ah"

  public: void __a0_after() {
    //print "Hello World" after constructing a World Object
    std::cout << "Hello World" << std::endl;
  }
#line 195 "main.acc"

public:
  static Hello *aspectof () {
    static Hello __instance;
    return &__instance;
  }
  static Hello *aspectOf () {
    return aspectof ();
  }
private:

#line 11 "ah_construction/hello_world.ah"

#line 11 "ah_construction/hello_world.ah"
}
#line 211 "main.acc"
;
namespace AC {
  __attribute((always_inline)) inline void invoke_Hello_Hello__a0_after () {
    ::Hello::aspectof()->__a0_after ();
  }
} 

#line 11 "ah_construction/hello_world.ah"

#line 11 "ah_construction/hello_world.ah"
;

#endif
#line 15 "ah_construction/main.cc"
#endif
#endif
#undef __ac_FIRST__home_Tom_aspectcX43X43__
#undef __ac_FIRST_FILE__home_Tom_aspectcX43X43_ah_construction_main_cc__
#endif // __ac_FIRST_FILE__home_Tom_aspectcX43X43_ah_construction_main_cc__
