summaryrefslogtreecommitdiff
path: root/TAO/tao/Valuetype/ValueFactory.h
blob: af8fbe0d5d71388eb3637c82dc63c25a073246ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// This may look like C, but it's really -*- C++ -*-

//=============================================================================
/**
 *  @file     ValueFactory.h
 *
 *  $Id$
 *
 *  @author  Torsten Kuepper  <kuepper2@lfa.uni-wuppertal.de>
 */
//=============================================================================

#ifndef TAO_VALUEFACTORY_H
#define TAO_VALUEFACTORY_H

#include /**/ "ace/pre.h"

#include "valuetype_export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "Value_VarOut_T.h"

#include "tao/Basic_Types.h"
#include "tao/orbconf.h"
#include "ace/Synch_Traits.h"
#include "ace/Thread_Mutex.h"
#include "ace/Null_Mutex.h"
#include "ace/CORBA_macros.h"
#include "tao/Environment.h"

namespace CORBA
{
  class AbstractBase;
  typedef AbstractBase *AbstractBase_ptr;

  class ValueBase;

  class ValueFactoryBase;

  extern TAO_Valuetype_Export void add_ref (ValueFactoryBase *);
  extern TAO_Valuetype_Export void remove_ref (ValueFactoryBase *);

  typedef TAO_Value_Var_T<ValueFactoryBase>
    ValueFactoryBase_var;

  typedef ValueFactoryBase_var ValueFactory_var;


  class TAO_Valuetype_Export ValueFactoryBase
  {
  public:
    ValueFactoryBase (void);
    virtual ~ValueFactoryBase (void);

    // non-virtual is non-standard
    void _add_ref (void);
    void _remove_ref (void);

    // private: %!
    /// In a derived class T use return type TAO_OBV_CREATE_RETURN_TYPE (T)
    /// (see at definition below)
    virtual CORBA::ValueBase * create_for_unmarshal (
      ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) = 0;

    // Not pure virtual because this will be overridden only by valuetypes
    // that support an abstract interface.
    virtual CORBA::AbstractBase_ptr create_for_unmarshal_abstract (void);

  private:
    CORBA::ULong _tao_reference_count_;
    TAO_SYNCH_MUTEX _tao_reference_count_lock_;
  };

}  // End CORBA namespace

namespace TAO
{
  /**
   * @brief Specializations needed for using with Value_Var_T
   */
  ACE_TEMPLATE_SPECIALIZATION
  struct TAO_Valuetype_Export Value_Traits<CORBA::ValueFactoryBase>
  {
    static void tao_add_ref (
        CORBA::ValueFactoryBase *);
    static void tao_remove_ref (
        CORBA::ValueFactoryBase *);

    // For INOUT value type arguments, so they can use the same set
    // of arg classes as interfaces.
    static void tao_release (
        CORBA::ValueFactoryBase *);
  };
}
// Use this macro for writing code that is independend from
// the compiler support of covariant return types of pointers to
// virtual inherited classes.
// (e.g. in egcs-2.90.29 980515 (egcs-1.0.3 release) its not yet implemented)
// (But it is TAO specific and at the moment the covariant case is not
// elaborated --- its just a suggestion.)

#ifdef TAO_HAS_OBV_COVARIANT_RETURN
#  define TAO_OBV_CREATE_RETURN_TYPE(TYPE) TYPE *
#else /*  TAO_HAS_OBV_COVARIANT_RETURN */
#  define TAO_OBV_CREATE_RETURN_TYPE(TYPE) CORBA::ValueBase *
#endif /* TAO_HAS_OBV_COVARIANT_RETURN */

// (The obtaining of the repository id is currently not yet like the OMG way. %!)
//
// Macro for on the fly registration of a factory (with type Factory).
// The repository id is taken from the static repository id of the
// valuetype via tao_repository_id () of the specialized factory.
// It forgets the pre-registered factory (if any) and the reference
// to the newly created one. (A new reference could be obtained with
// orb->lookup_value_factory (char * repo_id) .)

#define TAO_OBV_REGISTER_FACTORY(FACTORY, VALUETYPE) \
  { CORBA::ValueFactory factory = new FACTORY; \
    CORBA::ValueFactory prev_factory = \
    TAO_ORB_Core_instance ()->orb ()->register_value_factory (\
      VALUETYPE::_tao_obv_static_repository_id (),\
                                   factory); \
    if (prev_factory) prev_factory->_remove_ref (); \
    factory->_remove_ref (); }


#if defined (__ACE_INLINE__)
# include "ValueFactory.inl"
#endif /* __ACE_INLINE__) */

#include /**/ "ace/post.h"

#endif /* TAO_VALUEFACTORY_H */