ROOT logo
// @(#)root/reflex:$Id: Object.cxx 26193 2008-11-14 14:12:27Z axel $
// Author: Stefan Roiser 2004

// Copyright CERN, CH-1211 Geneva 23, 2004-2006, All rights reserved.
//
// Permission to use, copy, modify, and distribute this software for any
// purpose is hereby granted without fee, provided that this copyright and
// permissions notice appear in all copies and derivatives.
//
// This software is provided "as is" without express or implied warranty.

#ifndef REFLEX_BUILD
#define REFLEX_BUILD
#endif

#include "Reflex/Object.h"

#include "Class.h"
#include "DataMember.h"
#include "FunctionMember.h"


//-------------------------------------------------------------------------------
Reflex::Object 
Reflex::Object::Get( const std::string & dm ) const {
//-------------------------------------------------------------------------------
// Get a data member value of this object.
   Member m = TypeOf().MemberByName( dm );
   if ( !m )
      throw RuntimeError("No such MemberAt " + dm );
   return m.Get( * this );
}


/*/-------------------------------------------------------------------------------
  Reflex::Object
  Reflex::Object::Invoke( const std::string & fm,
  std::vector< Object > args ) const {
//-------------------------------------------------------------------------------
  Member m = TypeOf().FunctionMemberAt( fm );
  if ( m ) {
  if ( args.size() ) return m.Invoke( * this, args );
  else               return m.Invoke( * this );
  }
  else throw RuntimeError("No such MemberAt " + fm );
  return Object();
  }
*/


//-------------------------------------------------------------------------------
void
Reflex::Object::Invoke( const std::string & fm,
                        Object* ret,
                        const std::vector < void * >& args ) const {
//-------------------------------------------------------------------------------
// Invoke a data member of this object. Put return value(if not void) into ret.
   Invoke(fm, Type(), ret, args);
   /*
     m = TypeOf().FunctionMemberAt( fm );
     if ( m ) {
     if ( args.size() ) return m.Invoke( * this, args );
     else               return m.Invoke( * this );
     }
     else throw RuntimeError("No such MemberAt " + fm );
     return Object();
   */
}


//-------------------------------------------------------------------------------
void
Reflex::Object::Invoke( const std::string & fm,
                        const Type & sign,
                        Object* ret,
                        const std::vector < void * >& args ) const {
//-------------------------------------------------------------------------------
// Invoke a data member of this object. Sign can be used for finding overloaded funs.
// Put return value(if not void) into ret.
   Member m = TypeOf().FunctionMemberByName( fm, sign );
   if ( !m )
      throw RuntimeError("No such MemberAt " + fm );

   m.Invoke( * this, ret, args );
}


//-------------------------------------------------------------------------------
//void Reflex::Object::Set( const std::string & dm,
//                                const Object & value ) const {
//-------------------------------------------------------------------------------
//  Member m = TypeOf().MemberAt( dm );
//  if ( m ) m.Set( * this, value );
//  else throw RuntimeError("No such MemberAt " + dm );
//}


//-------------------------------------------------------------------------------
void Reflex::Object::Set2( const std::string & dm,
                                 const void * value ) const {
//-------------------------------------------------------------------------------
// Internal set method. Wrapped from Set methods.
   Member m = TypeOf().MemberByName( dm );
   if ( m ) m.Set( * this, value );
   else throw RuntimeError("No such MemberAt " + dm );
}
 Object.cxx:1
 Object.cxx:2
 Object.cxx:3
 Object.cxx:4
 Object.cxx:5
 Object.cxx:6
 Object.cxx:7
 Object.cxx:8
 Object.cxx:9
 Object.cxx:10
 Object.cxx:11
 Object.cxx:12
 Object.cxx:13
 Object.cxx:14
 Object.cxx:15
 Object.cxx:16
 Object.cxx:17
 Object.cxx:18
 Object.cxx:19
 Object.cxx:20
 Object.cxx:21
 Object.cxx:22
 Object.cxx:23
 Object.cxx:24
 Object.cxx:25
 Object.cxx:26
 Object.cxx:27
 Object.cxx:28
 Object.cxx:29
 Object.cxx:30
 Object.cxx:31
 Object.cxx:32
 Object.cxx:33
 Object.cxx:34
 Object.cxx:35
 Object.cxx:36
 Object.cxx:37
 Object.cxx:38
 Object.cxx:39
 Object.cxx:40
 Object.cxx:41
 Object.cxx:42
 Object.cxx:43
 Object.cxx:44
 Object.cxx:45
 Object.cxx:46
 Object.cxx:47
 Object.cxx:48
 Object.cxx:49
 Object.cxx:50
 Object.cxx:51
 Object.cxx:52
 Object.cxx:53
 Object.cxx:54
 Object.cxx:55
 Object.cxx:56
 Object.cxx:57
 Object.cxx:58
 Object.cxx:59
 Object.cxx:60
 Object.cxx:61
 Object.cxx:62
 Object.cxx:63
 Object.cxx:64
 Object.cxx:65
 Object.cxx:66
 Object.cxx:67
 Object.cxx:68
 Object.cxx:69
 Object.cxx:70
 Object.cxx:71
 Object.cxx:72
 Object.cxx:73
 Object.cxx:74
 Object.cxx:75
 Object.cxx:76
 Object.cxx:77
 Object.cxx:78
 Object.cxx:79
 Object.cxx:80
 Object.cxx:81
 Object.cxx:82
 Object.cxx:83
 Object.cxx:84
 Object.cxx:85
 Object.cxx:86
 Object.cxx:87
 Object.cxx:88
 Object.cxx:89
 Object.cxx:90
 Object.cxx:91
 Object.cxx:92
 Object.cxx:93
 Object.cxx:94
 Object.cxx:95
 Object.cxx:96
 Object.cxx:97
 Object.cxx:98
 Object.cxx:99
 Object.cxx:100
 Object.cxx:101
 Object.cxx:102
 Object.cxx:103
 Object.cxx:104
 Object.cxx:105
 Object.cxx:106