admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
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
Quintiq file version 2.0
#parent: #root
MethodOverride FindOrCreateSharedWithout (
  LibOpt_ScopeThin scope
) as LibOpt_ScopeShared
{
  TextBody:
  [*
    vector := NumberVector::Construct( this.Set() );
    
    vector.Set( scope.Index(), vector.Get( scope.Index() ).BitAnd( scope.Mask().BitNot() ) );
    
    // Determine the reduced size of the NumberVector
    size := vector.Size();
    for( {}; size > 1 and vector.Get( size - 1 ) = 0; size-- )
    { }
    
    group_vector := this.GroupVectorRemove( scope );
    
    result := null( LibOpt_ScopeShared );
    if( size = 1 )
    {
      result := LibOpt_ScopeShared32::FindSet32( vector.Get( 0 ), this.Type(), group_vector );
    }
    else
    {
      if( size <> vector.Size() )
      {
        vector.Resize( size );
      }
      result := LibOpt_ScopeSharedVector::FindSetVector( vector.AsBinaryValue(), this.Type(), group_vector );
    }
    
    if( isnull( result ) )
    {
      owner := select( this, ScopeSharedOnScope.ScopeThin, s, s <> scope );
      if( size = 1 )
      {
        result := owner.ScopeSharedOwned( relnew,
                                          LibOpt_ScopeShared32,
                                          Set := vector.Get( 0 ),
                                          Type := this.Type(),
                                          GroupVector := group_vector
                                          );
      }
      else
      {
        result := owner.ScopeSharedOwned( relnew,
                                          LibOpt_ScopeSharedVector,
                                          Set := vector.AsBinaryValue(),
                                          Type := this.Type(),
                                          GroupVector := group_vector
                                          );
      }
      
      traverse( this, ScopeSharedOnScope, ssos, ssos.ScopeThin() <> scope )
      {
        LibOpt_ScopeSharedOnScope::Create( ssos.ScopeThin(), ssos.Group(), result );
      }
    }
    
    return result;
  *]
}