include.dists.creating.m
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:4k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. // dists.include.creating.m
  2. // Code common to all distributions
  3. // Random version 0.8
  4. // 
  5. // Use if the generator is a Simple one:
  6. - setGenerator: (id <SimpleRandomGenerator>) generator
  7. {
  8.    if (randomGenerator) 
  9.      raiseEvent (InvalidCombination, 
  10.                  "%s: setting the generator more than once not allowedn",
  11.                  distName);
  12.    
  13.    randomGenerator = generator;
  14.    generatorMax = [randomGenerator getUnsignedMax];
  15.    
  16.    if ([randomGenerator respondsTo: M(advanceAll)])
  17.      { 
  18.        // split
  19.        useSplitGenerator = YES;
  20.        // printf("%s setGenerator: using split generator %sn",
  21.        // distName, [randomGenerator getName]);
  22.        
  23.      }
  24.    else if ([randomGenerator respondsTo: M(getUnsignedSample)])
  25.      {
  26.        // simple
  27.        
  28.        useSplitGenerator = NO;
  29.        virtualGenerator = 0;
  30.        // printf("%s setGenerator: using simple generator %sn",
  31.        // distName, [randomGenerator getName]);
  32.        
  33.      }
  34.    else
  35.      {
  36.        // neither
  37.        raiseEvent (InvalidCombination,
  38.                    "%s setGenerator: not a generator !!!n",
  39.                    distName);
  40.      }
  41.    
  42. /*
  43. // This code does not work, for unknown reasons:
  44.    if ( [randomGenerator conformsTo: @protocol(SimpleOut)]) {
  45.    } else if ( [randomGenerator conformsTo: @protocol(SplitOut)]) {
  46.    } else {
  47.    }
  48. */
  49.    if (useSplitGenerator) 
  50.      raiseEvent (InvalidCombination,
  51.                  "%s: wrong version of create: split generator %s detectedn",
  52.                  distName, [randomGenerator getName]);
  53.    
  54.    [self resetState];
  55.    
  56.    return self;
  57. }
  58. // Use this if the generator is a Split one:
  59. - setGenerator: (id <SplitRandomGenerator>) generator 
  60. setVirtualGenerator: (unsigned)vGen
  61. {
  62.   unsigned k;
  63.   
  64.   if (randomGenerator) 
  65.     raiseEvent (InvalidCombination,
  66.                 "%s: setting the generator more than once not allowedn",
  67.                 distName);
  68.   
  69.   randomGenerator = generator;
  70.   generatorMax = [randomGenerator getUnsignedMax];
  71.   
  72.   if ([randomGenerator respondsTo: M(advanceAll)])
  73.     {
  74.       // split
  75.       
  76.       useSplitGenerator = YES;
  77.       // printf("%s setGenerator: using split generator %sn",
  78.       // distName, [randomGenerator getName]);
  79.       
  80.     }
  81.   else if ([randomGenerator respondsTo: M(getUnsignedSample)])
  82.     {
  83.       // simple
  84.       
  85.       useSplitGenerator = NO;
  86.       virtualGenerator = 0;
  87.       // printf("%s setGenerator: using simple generator %sn",
  88.       // distName, [randomGenerator getName]);
  89.       
  90.     }
  91.   else
  92.     {
  93.       // neither
  94.       
  95.       raiseEvent (InvalidCombination,
  96.                   "%s setGenerator: not a generator !!!n",
  97.                   distName);
  98.       
  99.    }
  100.   
  101.   /*
  102.     // This code does not work, for unknown reasons:
  103.     if ( [randomGenerator conformsTo: @protocol(SimpleOut)]) {
  104.     } else if ( [randomGenerator conformsTo: @protocol(SplitOut)]) {
  105.     } else {
  106.     }
  107.   */
  108.   
  109.   if (!useSplitGenerator) 
  110.     raiseEvent (InvalidCombination,
  111.                 "%s: wrong version of create: non-split generator %s detectedn",
  112.                 distName, [randomGenerator getName]);
  113.   
  114.   if (virtualGenerator != MAXVGEN) 
  115.     raiseEvent (InvalidCombination,
  116.                 "%s setVirtualGenerator: already setn",
  117.                 distName);
  118.   
  119.   k = [randomGenerator getNumGenerators];
  120.   
  121.   if (vGen >= k)
  122.     raiseEvent (InvalidCombination,
  123.                 "%s setVirtualGenerator: vGen=%d > generator allows (%d)n", 
  124.                 vGen, k - 1);
  125.   
  126.   virtualGenerator = vGen;
  127.   
  128.   [self resetState];
  129.   
  130.   return self;
  131. }
  132. - createEnd
  133. {
  134.   // If no generator has been allocated, abort:
  135.   
  136.   if (!randomGenerator)
  137.     raiseEvent (InvalidCombination, 
  138.                 "%s initialized without a generator!n",
  139.                 distName);
  140.   
  141.    return [super createEnd];
  142. }
  143. // dists.include.creating.m